Résultat d'une commande bash dans python

Résolu
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

  1. 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
    1. 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
      1. 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
        1. 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
          1. 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
            1. 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
            2. Non tu n'as pas trouvé, car après text= il ne faut pas mettre de print, mais bien seulement sortie.
              0
            3. 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
          2. Donne moi en mode console le résultat de

            sortie=os.popen("cat /dev/usbtmc0", "r").readlines() 
            print sortie
            0
            1. >>> 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
          3. 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
            1. 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
              1. 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
                1. 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
                  1. 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
                  2. Si ligne représente la ligne parmi les lignes de output

                    for ligne in output:


                    Pour chaque ligne dans output, on traite
                    0
                  3. 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
                  4. 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
                2. 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
                  1. 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