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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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 éprouvé
    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
    Points : 1 066
    Points
    1 066
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    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()
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    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().
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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 sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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 éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    communicate est une méthode, donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stdout_value=a.communicate()
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 : 3 823
    Points : 7 119
    Points
    7 119
    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
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    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
    @+
    Merci d'utiliser le forum pour les questions techniques.

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 24
    Points : 13
    Points
    13
    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
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    "Invalid interface name/alias"

    A vous de voir
    Merci d'utiliser le forum pour les questions techniques.

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