Skrypt w pytonie 3

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2199
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Skrypt w pytonie 3

Post autor: kobrawerde »

Czy może ktoś doświadczony lub choćby obeznany w programowaniu w Pythonie rzucić okiem na skrypt który uruchamiany w systemie informuje o błędach :
TypeError: a bytes-like object is required, not 'str'
Troszkę poczytałem że jest to problem z konwersją / kodowaniem ? ... bajtów na string ? sory ale w programowaniu jestem zupełnym laikiem i pewnie już za późno na naukę na takim poziomie.
Skrypt działał prawidłowo w innym systemie i pewnie tu jest problem a dzieli ich pewnie "epoka" jakieś Ubuntu lub Debian z przed 10 lat a obecnie Debian (Bullseye) system ARM. O ile się dobrze zorientowałem w/w błędy występują z powodu innej wersji pythona obecnie to wersja 3 i sam skrypt nie uruchamia się zupełnie z plecenia : python example.py ....dając nieustanny błąd: ImportError: No module named smbus ( choć w systemie jest na pewno smbus ale pewnie dla python3 ? bo smbus dla pythona nie ma kandydata do instalacji pewnie już w danych repozytoriach jest tylko dla python3 )
Sam skrypt jest kombinowany i poprawiany dla (mało popularnego orangepi) + polskich znaków diakrytycznych które wyświetlały się jako różne "ślaczki" lub znaki :????????? na LCD 16x4 itd ( niestety ale większość lcd nie obsługuje polskich znaków diakrytycznych )

Kod: Zaznacz cały

#!/usr/bin/python
# -*- coding: utf-8 -*-
#--------------------------------------
#    ___  ___  _ ____
#   / _ \/ _ \(_) __/__  __ __
#  / , _/ ___/ /\ \/ _ \/ // /
# /_/|_/_/  /_/___/ .__/\_, /
#                /_/   /___/
#
#  lcd_i2c.py
#  LCD test script using I2C backpack.
#  Supports 16x2 and 20x4 screens.
#
# Author : Matt Hawkins
# Date   : 20/09/2015
#
# http://www.raspberrypi-spy.co.uk/
#
# Copyright 2015 Matt Hawkins
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#--------------------------------------
try:
    import smbus2 as smbus
except ImportError:
    import smbus
import time
import subprocess

from time       import sleep, strftime
from datetime   import datetime
from subprocess import *

# Define some device parameters
I2C_ADDR  = 0x3f # I2C device address
LCD_WIDTH = 16   # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x00  # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(0) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off 
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT

  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def replace_pl(chars):
  pl = {  'ą': 'a',
          'ć': 'c',
          'ę': 'e',
          'ł': 'l',
          'ń': 'n',
          'ó': 'o',
          'ś': 's',
          'ź': 'z',
          'ż': 'z',
          'Ą': 'A',
          'Ć': 'C',
          'Ę': 'E',
          'Ł': 'L',
          'Ń': 'N',
          'Ó': 'O',
          'Ś': 'S',
          'Ź': 'Z',
          'Ż': 'Z',
  }
  for f, t in pl.items():
    chars = chars.replace(f,t)
  return chars

def main():

  counter = 0


while True:

  # Get current status and playtime
    process = subprocess.Popen('sudo mpc -v', shell=True, stdout=subprocess.PIPE)
    ekran1 = process.communicate()[0]
    ekran1 = replace_pl(ekran1)
    statusLines = ekran1.split('\n')
    ekran1 = statusLines[1]
    if ekran1 > '':
      ekran1L1 = ekran1.split(' ',1)[0].strip()
      ekran1L2temp = ekran1.split(' ',1)[1].strip()
      ekran1L2 = ekran1L2temp.split(' ',1)[0].strip()

    process = subprocess.Popen('sudo mpc -f %name%', shell=True, stdout=subprocess.PIPE)
    ekran2 = process.communicate()[0]
    ekran2 = replace_pl(ekran2)
    statusLines = ekran2.split('\n')
    ekran2 = statusLines[0]
    ekran2L1 = ekran2[0:16]
    ekran2L2 = ekran2[16:31]

    process = subprocess.Popen('sudo mpc -f %artist%', shell=True, stdout=subprocess.PIPE)
    ekran3 = process.communicate()[0]
    ekran3 = replace_pl(ekran3)
    statusLines = ekran3.split('\n')
    ekran3 = statusLines[0]
    ekran3L1 = ekran3[0:16]
    ekran3L2 = ekran3[16:31]

    process = subprocess.Popen('sudo mpc -f %title%', shell=True, stdout=subprocess.PIPE)
    ekran4 = process.communicate()[0]
    ekran4 = replace_pl(ekran4)
    statusLines = ekran4.split('\n')
    ekran4 = statusLines[0]
    ekran4L1 = ekran4[0:16]
    ekran4L2 = ekran4[16:31]

    if counter == 1:
      if ekran1 == "":
        counter = 7
      else:
        lcd_string(ekran1L1,LCD_LINE_1)
        lcd_string(ekran1L2,LCD_LINE_2)
    if counter == 7:
      if ekran2 == "":
        counter = 14
      else:
        lcd_string(ekran2L1,LCD_LINE_1)
        lcd_string(ekran2L2,LCD_LINE_2)
    if counter == 14:
      if ekran3 == "":
        counter = 25
      else:
        lcd_string(ekran3L1,LCD_LINE_1)
        lcd_string(ekran3L2,LCD_LINE_2)
    if counter == 25:
      if ekran4 == "":
        counter = 35
      else:
        lcd_string(ekran4L1,LCD_LINE_1)
        lcd_string(ekran4L2,LCD_LINE_2)

    sleep(0.1)
    counter = counter + 1
    if counter == 40:
      counter = 1

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x00, LCD_CMD)
    lcd_byte(0x01, LCD_CMD)
    lcd_byte(0x08, LCD_CMD)
Dokładnie po wydaniu polecenia dostaję:
python3 radio.py

Kod: Zaznacz cały

Traceback (most recent call last):
  File "/root/radio.py", line 151, in <module>
    ekran1 = replace_pl(ekran1)
  File "/root/radio.py", line 138, in replace_pl
    chars = chars.replace(f,t)
TypeError: a bytes-like object is required, not 'str'
Jest to prosty skrypt wyświetlający informację na LCD z programu mpd/mpc nr. stacji radiowej / nazwę ...i informację z danej stacji jeśli takowe udostępnia np. nazwę odtwarzanego obecnie utworu muzycznego.
Ps. jeśli mi się uda to może opiszę jak zainstalować i podłączyć na ...u mnie Orangepi3 LTS + lcd 16x2 lub 40x2
Serwer: LinuxMint/Ubuntu 22.04/HWE kernel/Vsftpd/Kodi/Jellyfin/iptv-dvbt2/etc.
CPU: Intel N100 / RAM: 32GB DDR5
Storage: Lexar NM620 2TB M.2 - (x2)
Mobo: MiniPC (Topton X6C )
Laptop: Lenovo Legion 5 Pro 16ITH6H /Ram32GB/ssd500GB/ssd1TB
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2199
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: Skrypt w pytonie 3

Post autor: kobrawerde »

Niestety od 2020r python w wersji 2.x został ostatecznie zastąpiony wersją python3 która jest niekompatybilna z poprzednią czyli starsze skrypty nie będą działać :cry: ... można spróbować prze-konwertować starszy skrypt do wersji 3 programem : 2to3 to dla tych co nie potrafią programować .

Kod: Zaznacz cały

pip install 2to3
Użycie jest proste :

Kod: Zaznacz cały

 2to3 oldscript.py -n -w -o newscript.py
Jednak możemy przeczytać informację iż
Użycie 2to3-2.7 pozwala na konwersję składni do Pythona 3 (w szczególności instrukcje print), nie zadziała to, gdy cały biblioteki są wywoływane w Pythonie 2, które nie są migrowane bez aktualizacji do wersji 3.
Tak więc lipa nie wszystkie skrypty w ten sposób zadziałają a myślę że pewnie 90% z nich niestety nie upsss ...
Jednak jak zwykle Linux okazał się być całkiem "giętkim" systemem. Musimy utworzyć środowisko wirtualne dla Pythona 2 w systemie, uruchomić w/w i w starym skrypcie zmienić : #!/usr/bin/python ...na : #!/usr/bin/env python
wymagane jest także podczas uruchomienia wirtualnego środowiska python2 doinstalowanie brakujących modułów które nie miały kandydata w systemie u mnie : ImportError: No module named smbus dla pythona 2.x czyli:

Kod: Zaznacz cały

pip install smbus
Jak takie środowisko utworzyć ? podaję link
https://ivanitlearning.wordpress.com/20 ... -practice/
Pewnie jeśli dany skrypt jest niezbyt skomplikowany i duży to poprawianie w/w będzie dla doświadczonego programisty łatwe ale gdy
jest naprawdę dużo to pewnie nikomu nie będzie się chciało grzebać za free w takim kodzie tak więc dobrze że jest jakaś alternatywa.
Ps. jeszcze kwestia uruchomienia takowego "leciwego" skryptu przy starcie systemu. Wystercza stworzyć skrypt uruchamiany przy starcie ze ścieżką do pythona (virtualnego) i ścieżki do swojego skryptu np.

Kod: Zaznacz cały

#!/bin/bash
/ścieżka_do_pythona_virtual/bin/python /ścieżka_do_starego_skryptu/example.py
więcej :
https://unix.stackexchange.com/question ... at-startup
https://serverfault.com/questions/82157 ... virtualenv
Serwer: LinuxMint/Ubuntu 22.04/HWE kernel/Vsftpd/Kodi/Jellyfin/iptv-dvbt2/etc.
CPU: Intel N100 / RAM: 32GB DDR5
Storage: Lexar NM620 2TB M.2 - (x2)
Mobo: MiniPC (Topton X6C )
Laptop: Lenovo Legion 5 Pro 16ITH6H /Ram32GB/ssd500GB/ssd1TB
Awatar użytkownika
radekcz
Piegowaty Guziec
Piegowaty Guziec
Posty: 9
Rejestracja: 23 mar 2009, 11:08
Płeć: Mężczyzna
Wersja Ubuntu: 24.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: Skrypt w pytonie 3

Post autor: radekcz »

Jeśli nie chcesz grzebać w konwersji z 2 na 3 to zainstaluj obok starszą wersję Pythona.
Masz klika opcji: Najpewniejsze chyba będzie ostatnie rozwiązanie:

1. Zarządzanie środowiskami

Tworzenie nowego środowiska:

Kod: Zaznacz cały

conda create --name myenv
Możesz dodać specyficzne pakiety do zainstalowania, np.:

Kod: Zaznacz cały

conda create --name myenv python=3.9 numpy
Aktywacja środowiska:

Kod: Zaznacz cały

conda activate myenv
Dezaktywacja środowiska:

Kod: Zaznacz cały

conda deactivate
Usuwanie środowiska:

Kod: Zaznacz cały

conda remove --name myenv --all
2. Zarządzanie pakietami

Instalowanie pakietu:

Kod: Zaznacz cały

conda install numpy
Aktualizacja pakietu:

Kod: Zaznacz cały

conda update numpy
Usuwanie pakietu:

Kod: Zaznacz cały

conda remove numpy
Oczywiście można używać także polecenia pip do pobierania pakietów pipowych :-)

3. Zarządzanie conda

Aktualizacja conda:

Kod: Zaznacz cały

conda update conda
Lista wszystkich dostępnych środowisk:

Kod: Zaznacz cały

conda env list
Informacje o bieżącym środowisku:

Kod: Zaznacz cały

conda info
:boat:
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2199
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: Skrypt w pytonie 3

Post autor: kobrawerde »

Można spróbować też tak po odinstalowaniu python-a 3 :

Kod: Zaznacz cały

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
sudo tar xzf Python-2.7.9.tgz
cd Python-2.7.9
sudo ./configure --enable-optimizations
sudo make altinstall
Potem sprawdzamy :

Kod: Zaznacz cały

python2.7 -V
~ Python 2.7.9 jeśli OK
to potem:

Kod: Zaznacz cały

sudo ln -sfn '/usr/local/bin/python2.7' '/usr/bin/python2'
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
Serwer: LinuxMint/Ubuntu 22.04/HWE kernel/Vsftpd/Kodi/Jellyfin/iptv-dvbt2/etc.
CPU: Intel N100 / RAM: 32GB DDR5
Storage: Lexar NM620 2TB M.2 - (x2)
Mobo: MiniPC (Topton X6C )
Laptop: Lenovo Legion 5 Pro 16ITH6H /Ram32GB/ssd500GB/ssd1TB
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2199
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: Skrypt w pytonie 3

Post autor: kobrawerde »

Może ktoś jest obeznany w środowisku anaconda ...próbuję w innym systemie (debian / bookworm) uruchomić wirtualkę pythona2 i lipa :-( .... w anaconda niby python2 działa to wersja : 2.7.15 ale chyba nie da się zainstalować modułu : smbus ... podobnie jak na wcześniejszych moich przykładach. Co prawda jest to odmiana anacondy raczej fork minianacondy : Miniforge3
https://github.com/conda-forge/miniforge
ale to raczej nie ma znaczenia ...z wcześniejszymi metodami to pewnie problem z repozytoriami starsze (bullseye) to pewnie umożliwiały ? a na bookworm już coś pousuwano i dominuje wyłącznie python3. Jeśli anaconda umożliwia pełną wirtualkę środowiska pyton2 to czemu nie działa :smbus ?
Ps. ok chyba się udało ...wyłączyłem na trochę nowsze repozytoria debiana bookworm z oficjalnego Debiana i zostawiłem tylko debian bullseye (ale z repozytorium chińskiego) .... i zadziałało :-) instalacja według

Kod: Zaznacz cały

sudo apt install virtualenv

https://ivanitlearning.wordpress.com/20 ... -practice/
po skonfigurowaniu wszystkiego zmieniłem repo na bookworm nie jest to zbyt profesjonalne ....ale działa :razz:
Serwer: LinuxMint/Ubuntu 22.04/HWE kernel/Vsftpd/Kodi/Jellyfin/iptv-dvbt2/etc.
CPU: Intel N100 / RAM: 32GB DDR5
Storage: Lexar NM620 2TB M.2 - (x2)
Mobo: MiniPC (Topton X6C )
Laptop: Lenovo Legion 5 Pro 16ITH6H /Ram32GB/ssd500GB/ssd1TB
Awatar użytkownika
kobrawerde
Gibki Gibbon
Gibki Gibbon
Posty: 2199
Rejestracja: 10 wrz 2006, 16:00
Płeć: Mężczyzna
Wersja Ubuntu: 22.04
Środowisko graficzne: Cinnamon
Architektura: x86_64
Kontakt:

Re: Skrypt w pytonie 3

Post autor: kobrawerde »

OK może to niezbyt profesjonalne ale jeśli ktoś szuka metody na konwersję skryptu pythona2 na V3 to można skorzystać z chatgpt który poprawnie skonwertował w/w mój skrypt w 97% poprawnie. Tylko kilka wpisy wymagały poprawy i działa OK :-)
https://chatgpt.com/
Serwer: LinuxMint/Ubuntu 22.04/HWE kernel/Vsftpd/Kodi/Jellyfin/iptv-dvbt2/etc.
CPU: Intel N100 / RAM: 32GB DDR5
Storage: Lexar NM620 2TB M.2 - (x2)
Mobo: MiniPC (Topton X6C )
Laptop: Lenovo Legion 5 Pro 16ITH6H /Ram32GB/ssd500GB/ssd1TB
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 5 gości