Résultat d'une commande bash dans python

Résolu/Fermé
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015 - 30 août 2010 à 01:06
 Utilisateur anonyme - 30 août 2010 à 17:01
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

Utilisateur anonyme
30 août 2010 à 11:24
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.
5
shrek.spirit Messages postés 10 Date d'inscription mardi 13 juillet 2010 Statut Membre Dernière intervention 30 août 2010 5
30 août 2010 à 03:48
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.
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 14:05
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)
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
Modifié par toto5812 le 30/08/2010 à 14:14
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
30 août 2010 à 14:18
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)
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 14:24
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
0
Utilisateur anonyme
30 août 2010 à 14:33
Non tu n'as pas trouvé, car après text= il ne faut pas mettre de print, mais bien seulement sortie.
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 14:34
ah oui, désolé, c'est une faute de frappe sur le forum... C'était bien ce que j'avais fait dans mon programme...
:-)
0
Donne moi en mode console le résultat de

sortie=os.popen("cat /dev/usbtmc0", "r").readlines() 
print sortie
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
Modifié par toto5812 le 30/08/2010 à 15:28
>>> 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
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 14:36
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...
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
Modifié par toto5812 le 30/08/2010 à 15:22
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é"...

:-(
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 15:54
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
0
Utilisateur anonyme
30 août 2010 à 16:21
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
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 16:24
Ok merci, c'est très clair!

mais le mot "ligne", il le reconnaît comme ça?? il n'est définit nulle part?
0
Utilisateur anonyme
30 août 2010 à 16:33
Si ligne représente la ligne parmi les lignes de output

for ligne in output:


Pour chaque ligne dans output, on traite
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
Modifié par toto5812 le 30/08/2010 à 16:39
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??
0
toto5812 Messages postés 57 Date d'inscription mercredi 5 août 2009 Statut Membre Dernière intervention 21 janvier 2015
30 août 2010 à 16:55
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!
0
Utilisateur anonyme
30 août 2010 à 16:54
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é.
0
Utilisateur anonyme
30 août 2010 à 17:01
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
0