Retour de commande dans Textbox avec caracteres bizarre

Retour de commande dans Textbox avec caracteres bizarre - Python - Programmation

Marsh Posté le 13-02-2024 à 20:23:08    

Bonjour,
 
Je suis sur python 3.11.2 sur Linux Ubuntu
 
J'ai besoin d'avoir un retour de commande shell dans un Tetbox
 
 

Code :
  1. import subprocess
  2. process = subprocess.Popen(['/opt/go2tv/go2tv', '-l'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #"ls -alh /dev"
  3. liste_retour = process.stdout.readlines()
  4.    
  5. print ("liste_retour : ", liste_retour)
  6. for idex, retour in enumerate(liste_retour):
  7. checklist.insert("end", retour)


 
mais une fois dans la Textbox, il  y a des caractéres bizarre

Code :
  1. Device 1
  2. --------
  3. Model: [TV]Samsung LED22
  4. URL:   http://192.168.1.27:7676/smp_15_


 
et la liste resemble a ça

Code :
  1. liste_retour :  [b'\n', b'\x1b[1mDevice 1\x1b[0m\n', b'\x1b[1m--------\x1b[0m\n', b'\x1b[1mModel:\x1b[0m [TV]Samsung LED22\n', b'\x1b[1mURL:\x1b[0m   http://192.168.1.27:7676/smp_15_n', b'\n']


 
Pouvez-vous m'aidrer ?
 
Merci d'avance pour vos avis et conseils.


Message édité par xunil2003 le 13-02-2024 à 20:28:51
Reply

Marsh Posté le 13-02-2024 à 20:23:08   

Reply

Marsh Posté le 13-02-2024 à 22:58:21    

Ces caractères permettent d'afficher du texte en couleur dans un terminal qui le supporte (comme c'est le cas sous Linux). Il faudra filtrer ça, avec un truc tout fait ou à la main.
 
https://en.wikipedia.org/wiki/ANSI_escape_code


---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Marsh Posté le 14-02-2024 à 08:01:38    

Re,  
Quand vous dites 'il faut filter' que voulez vous dire ? quoi utiliser pour filtrer avec python ?
Je ne comprend pas tres bien ce que vous voulez dire par filtrer ?
 

Code :
  1. def test():
  2.     liste  = []
  3.     liste_retour = [b'\n', b'\x1b[1mDevice 1\x1b[0m\n', b'\x1b[1m--------\x1b[0m\n', b'\x1b[1mModel:\x1b[0m [TV]Samsung LED22\n', b'\x1b[1mURL:\x1b[0m   http://192.168.1.27:7676/smp_15_n', b'\n']
  4.     for index, valeur in enumerate(liste_retour):
  5.         print ("valeur : ",valeur)
  6.      
  7. test()


 
me retourne :

Code :
  1. serveur@RPI-5:~ $ python3 /home/serveur/Langages/python/3/videos2/test-01.py
  2. valeur :  b'\n'
  3. valeur :  b'\x1b[1mDevice 1\x1b[0m\n'
  4. valeur :  b'\x1b[1m--------\x1b[0m\n'
  5. valeur :  b'\x1b[1mModel:\x1b[0m [TV]Samsung LED22\n'
  6. valeur :  b'\x1b[1mURL:\x1b[0m   http://192.168.1.27:7676/smp_15_n'
  7. valeur :  b'\n'
  8. serveur@RPI-5:~ $


 
Ou bien je n'utilise pas la bonne métode ?
Pour filtrer faut-til trier les caractéres un par un, de la liste afin de les supprimer ?
Merci


Message édité par xunil2003 le 14-02-2024 à 08:04:35
Reply

Marsh Posté le 14-02-2024 à 08:59:05    

Non l'idée c'est de faire un replace de tout ce que tu veux supprimer avant l'affichage...
https://www.w3schools.com/python/ref_string_replace.asp
 
Genre:

Code :
  1. for idex, retour in enumerate(liste_retour):
  2.     retour = retour.replace("[1m", "" )
  3.     retour = retour.replace("[0m", "" )
  4.     checklist.insert("end", retour)


 
Chui pas un pro de python, y'a surement mieux que replace pour remplacer plusieurs chaines différente... :o


---------------
D3
Reply

Marsh Posté le 14-02-2024 à 09:50:27    

Re,
 
avec :

Code :
  1. for index, retour in enumerate(liste_retour):
  2.     print ("retour : ",retour)
  3.     retour2 = retour.replace("[1m", "" )


il me retourne
 

Code :
  1. serveur@RPI-5:~ $ python3 /home/serveur/Langages/python/3/videos2/test-01.py
  2. retour :  b'\n'
  3. Traceback (most recent call last):
  4.   File "/home/serveur/Langages/python/3/videos2/test-01.py", line 65, in <module>
  5.     test3()
  6.   File "/home/serveur/Langages/python/3/videos2/test-01.py", line 57, in test3
  7.     retour2 = retour.replace("[1m", "" )
  8.               ^^^^^^^^^^^^^^^^^^^^^^^^^^
  9. TypeError: a bytes-like object is required, not 'str'
  10. serveur@RPI-5:~ $


Faut-il y traiter bytes par bytes ?
 
Merci.


Message édité par xunil2003 le 14-02-2024 à 09:51:45
Reply

Marsh Posté le 14-02-2024 à 10:13:25    

Comme je le disais, j'y connais pas grand chose en Python mais avec le message d'erreur dans Google on peut trouver ce genre de chose :
https://www.stechies.com/typeerror- [...] d-not-str/
 
A priori faut convertir en UTF8 ce qui est ouvert en mode binaire (genre ton Popen, a priori).
Essaye en ajoutant :

Code :
  1. retour.decode('utf8')


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed