Résultat d'une commande bash dans python

[Résolu/Fermé]
Signaler
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015
-
 Utilisateur anonyme -
Bonjour,

Je souhaiterais que le résultat d'une commande bash s'affiche dans une interface graphique en python (Tkinter).
Voici la commande en question et son résultat:
$ cat /dev/usbtmc0
Minor Number	Manufacturer	Product	Serial Number
001         Tektronix          TDS2002b        C630058

Il s'agit d'un oscilloscope numérique connecté en usb.
En fait j'aimerais tester le résultat de cette commande et qu'un message s'affiche dans mon programme python en fonction du résultat, quelque chose du genre:

"l'appareil Tektronix TDS2002b est bien connecté" ou "aucun appareil n'a été détecté, vérifier la connexion!"

C'est possible à votre avis? Je précise que je débute en programmation... Je cherche beaucoup sur le net, mais là je ne trouve pas vraiment ce que je voudrais....

Merci


12 réponses


Pas forcément sur un fichier (enfin c'est possible), mais bon tu utilises l'emploi supplémentaire à des fonctions comme

ouvrir le fichier
lire le fichier
traiter les lignes du fichier
copier les lignes dans le textedit

Pour récupérer simplement la sortie d'une commande on peut utiliser la méthode popen() du module os.

sortie=os.popen("cat /dev/usbtmc0", "r").read()
print sortie


Ensuite il est évident qu'il est possible de rentrer cette valeur de sortie dans un Edit text de Tkinter.
4
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
10
Date d'inscription
mardi 13 juillet 2010
Statut
Membre
Dernière intervention
30 août 2010
5
salut,

du moment où t'es sur linux tout est possible ( enfin,, presque).
essai de rediriger la sortie de ton application bash quelque part ( sur un fichier par exemple) et récuperer ( lire sur ce dernier fichier) le resultat sur ton application python s'il ya une fonction dans tkinter ou dans un autre module qui te permet de le faire.
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Ok, merci!


sortie=os.popen("cat /dev/usbtmc0", "r").read()
print sortie



ça marche en console, mais je n'arrive pas à l'intégrer dans un label du genre:

      label = Tkinter.Label(self,text="print sortie", fg="red", height="2")
      label.grid(column=0,row=1,columnspan=5)
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

arf, trouvé, à force d'essayer... c'était tout bête, il fallait juste enlever les guillemets:

      label = Tkinter.Label(self,text=print sortie, fg="red", height="2") 
      label.grid(column=0,row=1,columnspan=5)


Bon, c'est déja pas mal... ça affiche toute la sortie:

Minor Number Manufacturer Product Serial Number 
001         Tektronix          TDS2002b        C630058



Mais pour améliorer, serait-il possible de récupérer le nom et le modèle de l'appareil (Tektronix TDS2002b) et d'afficher un message du genre:

L'appareil Tektronix TDS2002b est correctement branché!


et si aucun appareil n'est connecté, la sortie devient:


Minor Number Manufacturer Product Serial Number 



et là j'aimerais un message du genre:

Aucun appareil détecté... Vérifier le branchement et relancer le programme.


Pensez que c'est faisable simplement?
Merci

lol, oui je pense qu'il te manque quelques bases, à revoir.

Pour le coup je corrige, mais la prochaine fois fait un effort :)

sortie=os.popen("cat /dev/usbtmc0", "r").read()
label = Tkinter.Label(self,text=sortie, fg="red", height="2")
label.grid(column=0,row=1,columnspan=5)
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

merci! mais je précise que j'avais réussi à trouver tout seul! :-)
Après avoir essayé toutes les combinaisons possibles... J'avais oublié la plus simple :-)

Mais, oui, en effet c'est la toute première fois que je manipule python... J'y connais vraiment pas grand chose en fait, mais grâce aux différents exemples et à l'aide précieuse sur ce forum e sens que je vais arriver à mes fins!

Merci encore
Utilisateur anonyme
Non tu n'as pas trouvé, car après text= il ne faut pas mettre de print, mais bien seulement sortie.
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

ah oui, désolé, c'est une faute de frappe sur le forum... C'était bien ce que j'avais fait dans mon programme...
:-)
Donne moi en mode console le résultat de

sortie=os.popen("cat /dev/usbtmc0", "r").readlines() 
print sortie
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

>>> sortie=os.popen("cat /dev/usbtmc0", "r").readlines()
>>> print sortie
['Minor Number\tManufacturer\tProduct\tSerial Number\n']


là il y a rien de connecté, sinon, il doit y avoir encore:
001 Tektronix TDS2002b C630058
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Bon j'ai trouvé ce qui semble me correspondre:

		status, output = getstatusoutput('cat /dev/usbtmc0')
		estConnecte = False
		if not status:
			for ligne in output:
				if ligne.find('Product') != -1:
					vendor = ligne.split()[1]
					modele = ligne.split()[2]
					estConnecte = True
					sortie= "L'appareill %s %s est bien connecté" % (vendor, modele,)
		if not estConnecte:
			sortie= "Aucun appareil detecté"


		label = Tkinter.Label(self,text=sortie, fg="red", height="2")


ça a l'air de marcher.... Faut juste que je teste avec un appareil connecté! :-)
Mais j'en ai malheureusement pas sous la main...
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Bon je me suis créé un fichier de test qui normalement contient ce que doit afficher cat /dev/usbtmc0... je l'ai appelé a:



cat a  
Minor Number     Manufacturer    Product Serial Number   
001          Tektronix       TDS2002b      C630058


Et j'ai remplacé :


status, output = getstatusoutput('cat a')  

Mais ça affiche toujours "aucun appareil detecté"...

:-(
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Je cherche ce qui coince, je comprends à peu près le principe, mais j'aurais besoin d'une précision sur ce que signifie exactement cette ligne:

if ligne.find('Product') != -1:


notamment sur la signification du != -1

Merci

J'aime pas ce genre de notation.

En fait on cherche dans la ligne si le mot "product", qui te renvoi un numéro d'index supérieur ou égal à 0 si il est trouvé et égal à -1 si il ne le trouve pas.

On peut traduire

Si le mot "Product" est dans ligne:
    traiter la suite
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Ok merci, c'est très clair!

mais le mot "ligne", il le reconnaît comme ça?? il n'est définit nulle part?
Utilisateur anonyme
Si ligne représente la ligne parmi les lignes de output

for ligne in output:


Pour chaque ligne dans output, on traite
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

ok, ça devrait fonctionner alors, non?

Je récapitule:

mon fichier a:


Minor Number     Manufacturer    Product Serial Number    
001          Tektronix       TDS2002b      C630058



mon code:
  status, output = getstatusoutput('cat a') 
  estConnecte = False 
  if not status: 
   for ligne in output: 
    if ligne.find('Product') != -1: 
     vendor = ligne.split()[1] 
     modele = ligne.split()[2] 
     estConnecte = True 
     sortie= "L'appareil %s %s est bien connecté" % (vendor, modele) 
  if not estConnecte: 
   sortie= "Aucun appareil detecté"


print sortie 
Aucun appareil détecté 


Qu'est ce qui ne va pas??
Messages postés
57
Date d'inscription
mercredi 5 août 2009
Statut
Membre
Dernière intervention
21 janvier 2015

Il faut remplacer les lignes 4 et 5 du code par:

for ligne in output.split('\n'):
        if ligne.find('Product') == -1:


Et c'est bon!

getstatusoutput que je ne connais pas d'ailleurs et qui est déconseillé pour les new version de python (tu me diras os.popen est dans la même lignée) ne sert juste qu'à vérifier que ta commande existe.

Mieux vaut, c'est fortement conseillé, j'ai encore de vieilles habitudes, utiliser le module subprocess.

Voir la doc officielle, tout y est expliqué.

Voici un petit exemple

sortie=subprocess.Popen("cat /dev/usbtmc0", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out=sortie.stdout.read().split("\n")


Normalement tu auras tes résultats de cette façon