IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Récupérer le résultat de commandes shell


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut Récupérer le résultat de commandes shell
    Bonjour,

    J'ai un petit script python qui lance des commandes dans un terminal qui permet de tester si certaines lignes sont présentes dans un fichier.Ensuite je fais un test, si elles sont présentes je voudrais les supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	def errorIface(self):	
    		a=commands.getoutput("tail /home/ubuntu/Desktop/glade/tmp.txt|grep 'Invalid interface name/alias: %s'" % self.parameters['ifaceSci'])
    		#c=a.read()		
    		b=commands.getoutput("tail /home/ubuntu/Desktop/glade/tmp.txt|grep 'Invalid interface name/alias: %s'" % self.parameters['ifaceCdam'])
    		#d=b.read()
    		print a,b
    		print ('------------------------------------')
    		if a!='' or b!='':
    			os.system("sed '/interface/d' /home/ubuntu/Desktop/glade/tmp.txt")
    			gladeXml.get_widget('Image_Red').show()
    			gladeXml.get_widget('Image_Green').hide()
    			gladeXml.get_widget('Image_Error').show()
    			gladeXml.get_widget('LabelErrorInterface').show()
    Le problème est que a et b sont vides du coup je ne peux pas les comparer. J'ai essayé avec la commande os.popen (ya encore les read) mais je n'y arrive pas plus.
    D'ailleurs j'ai l'impression que la commande sed ne marche pas non plus :s
    Quelqu'un pourrait aurait une idée?

  2. #2
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Citation Envoyé par Alwik Voir le message
    D'ailleurs j'ai l'impression que la commande sed ne marche pas non plus :s
    Voilà par où commencer. Assure-toi que la commande `sed` fonctionne correctement depuis un shell.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut
    Ok la commande sed ne fais pas exactement ce que je veux, et j'ai compris pourquoi, mais le vrai problème est que je n'arrive pas à récupérer et donc à comparer les deux premiers résultats (a et b)

    edit:
    La ligne qui lance la commande sed a été modifiée comme telle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("sed -i '/Invalid interface/d' /home/ubuntu/Desktop/glade/tmp.txt ")

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Il faut utiliser le module os, mais pas la méthode system pour récupérer les infos.

    Il te faut la méthode Popen()

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Heu, le Popen de la bibliothèque subprocess ne serait-il pas plus recommandable?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Heu, le Popen de la bibliothèque subprocess ne serait-il pas plus recommandable?
    Heu ça serait pas une question fermée ci-dessus?

    En effet, subprocess.Popen() tend à remplacer l'ancien os.Popen().

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Il faut utiliser le module os, mais pas la méthode system pour récupérer les infos.

    Il te faut la méthode Popen()
    J'ai déjà essayé (il y a encore les read en commentaire).
    Maintenant je suis en train de me plonger dans la doc de subprocess, mais ca a l'air assez complexe.
    En tout cas merci pour les conseils

    Edit: bon je n'y arrive pas plus que ça :s je ne comprends pas trop a quoi servent tous les arguments de Popen, et je ne vois pas comment je peux lui faire passer mon self.parameters['ifaceSCI'] en parametre.Quelqu'un peut m'orienter ou me donner un début de réponse?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut
    Maintenant je suis en train de me plonger dans la doc de subprocess, mais ca a l'air assez complexe.
    Inspirez vous des exemples de Doug Hellmann
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut
    Je dois être un peu niais, je n'arrive pas à comprendre comment fonctionne cette classe Popen :s
    Je n'arrive pas à combiner la commande grep au tail
    J'ai essayé qqch de plus simple pour commencer et cela ne marche meme pas :s

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=subprocess.Popen("ls",stdout=subprocess.PIPE)
    stdout_value=a.communicate
    print stdout_value
    a.kill()
    J'ai inversé les deux dernieres lignes, mais rien n'y fait je n'ai aucun résultat qui s'affiche dans mon terminal, sauf quand je stoppe mon application avec ctrl+c
    Bref je regrette la simplicité du os.popen puis read()

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    communicate est une méthode, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stdout_value=a.communicate()

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je pensais à une chose

    tail est une commande linux et j'ai pas linux, donc je ne suis pas sur de ce que je dis, mais cette commande ne servirait-elle pas à donner les n dernières lignes d'un fichier?

    Si oui c'est faisable avec python, non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def tail(filename, n):
        return deque(open(filename), n)
    Edit : Je précise la méthode deque fait partie du module collections

    donc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from collections import deque

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut
    Oui effectivement j'ai mal recopié la ligne de code il y a bien des parenthéses a la suite de communicate, mea culpa

    Effectivement tail est une commande linux qui permet d'avoir les n dernières lignes d'un fichier, mais couplée a grep elle permet d'avoir les lignes contenant ma chaine de caractères, dans mon cas Invalid interface name/alias: maVariable

    Et le fait que maVariable ne soit pas fixe semble poser des problèmes :s

  13. #13
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Je ne comprend pas le problème avec pipe, c'est dans la doc (17.1.3.2).
    Pour le sed c'est 17.1.3.1.

    Exemple avec un head:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> from subprocess import *
    >>> p1 = Popen(["head", "/etc/passwd"], stdout=PIPE)
    >>> p2 = Popen(["grep", "root"], stdin=p1.stdout, stdout=PIPE)
    >>> output = p2.communicate()[0]
    >>> print output
    root:x:0:0:root:/root:/bin/bash
    @+

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Par défaut
    Merci PauseKawa, ton exemple m'a aidé à comprendre la logique du bazar :p
    Par contre le résultat n'est pas ce que j'escomptais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a=Popen(["tail","/home/ubuntu/Desktop/glade/tmp.txt"], stdout=PIPE)
    b=Popen(["grep","Invalid interface name/alias: "], stdin=a.stdout, stdout=PIPE)
    output=b.communicate()[0]
    print output
    Et j'obtiens une ligne vide alors que dans le même temps quand je fais cette commande dans un terminal j'ai bien un résultat.

  15. #15
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    "Invalid interface name/alias"

    A vous de voir

Discussions similaires

  1. [vb6] Récupérer les résultats d'un shell
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 14/06/2006, 16h57
  2. Récupérer le résultat d'une commande shell
    Par espadon1 dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 10h01
  3. Réponses: 5
    Dernier message: 31/05/2006, 19h30
  4. Récupération du résultat d'une commande shell
    Par klu dans le forum Langage
    Réponses: 8
    Dernier message: 16/02/2006, 23h34
  5. Réponses: 2
    Dernier message: 02/01/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo