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 :

Utilisation de os.system ou subprocess.Popen


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut Utilisation de os.system ou subprocess.Popen
    Bonjour,

    je cherche à exécuter une succession de ligne de commande Windows en Python du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cd c:/
    dir
    hostname
    En réalité, je veux lancer un programme en ligne de commande et récupérer ses sorties.
    Je dois donc me rendre dans son répertoire et le lancer avec les arguments qui vont bien.

    Mon souci est que je n'arrive pas à enchainer plusieurs commandes:
    J'ai vu plusieurs méthodes sur la doc Python (une liste d'arguments, mais c'est du Linux).

    Que je passe mes arguments sous forme de chaîne ou sous la forme d'un tableau ça plante.

    Ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import subprocess
    args = ['hostname']
    proc = subprocess.Popen(args,shell=True,stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]
    Ça plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import subprocess
    args = ['hostname','dir']
    proc = subprocess.Popen(args,shell=True,stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]
    Là je coince.
    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    salut,

    args n'est pas une liste de commandes mais bien une liste d'arguments (comme son nom l'indique) et se traduit donc par la commande:

    hostname dir

    et non:

    hostname
    dir

    la solution ?

    - soit écrire un script (.bat qui fait les commandes que tu veux et le lancer depuis un subprocess)
    - soit écrire un script Python qui fait la même chose et le lancer avec un subprocess
    - soit utiliser pexpect
    - soit autre chose que j'ignore

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Merci Kango,

    l'idée est d'utiliser les modules standard de python.
    Donc je ne veux pas (si possible) utiliser pexpect.

    Dans un premier temps je dois me rendre dans le dossier qui contient l’exécutable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cd "C:\Program Files (x86)\soft"
    Ensuite lancer l'exe avec la liste d'arguments soit:

    Je souhaiterai éviter le *.bat
    Cette solution pourrait m'intéresser, mais je ne vois pas comment m'y prendre.
    - soit écrire un script Python qui fait la même chose et le lancer avec un subprocess
    Aurais-tu un exemple tout simple:
    1-redirection vers un dossier.
    2-Lancement d'un programme

    Merci.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Je ne vois pas où est le problème*? Il suffit de faire plusieurs appels à subprocess.Popen, non*? Genre*:

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     import subprocess
    subprocess.Popen(("cd", '"C:\Program Files (x86)\soft"', shell=True, stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]
    proc = subprocess.Popen(("lmutil", "lmstat", "-a", "-c"),shell=True,stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]

    Etc.

  5. #5
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Plus simple à gérer peut-être ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import subprocess
     
    lcommandes = [["cd", '"C:\Program Files (x86)\soft"'], ["lmutil", "lmstat", "-a","-c"]]
     
    for cmd in lcommandes:
        subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
        out = proc.communicate()
        print out[0]
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Merci mont29,

    Le problème c'est que lorsque tu effectues des subprocess.Popen() à la suite, le second ne tient pas compte des instructions du premier.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import subprocess
    proc = subprocess.Popen(("cd", '"C:\\Temp"'), shell=True, stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]
    proc = subprocess.Popen(("dir"), shell=True, stdout=subprocess.PIPE)
    out = proc.communicate()
    print out[0]
    Ca ne lira pas les dossiers de c:\Temp, mais du répertoire où l'on éxecute les fichiers *.py.
    Donc lorsque je change de directory avec le premier subprocess.Popen() et que j'essaye de lancer le programme avec le deuxième avec le deuxième, il ne le trouve pas puisqu'il n'est pas dans le répertoire.

    Y a t il un moyen de les chainer.

    Merci

  7. #7
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    Pourquoi ne pas utiliser des fonction python std alors plutôt que des fonction systèmes appelées.

    Ainsi, tu fais :

    chdir(répertoire_execution)
    Popen([command]...)
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 41
    Points : 39
    Points
    39
    Par défaut
    Parfait Panda31,

    C'est ce qu'il me fallait.

    Merci.

  9. #9
    Membre éclairé
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Points : 848
    Points
    848
    Par défaut
    De rien

    Pense au
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer exécutable & arguments (os.system vs subprocess.Popen)
    Par mnementh64 dans le forum Général Python
    Réponses: 4
    Dernier message: 26/01/2012, 11h35
  2. Réponses: 5
    Dernier message: 16/02/2011, 10h23
  3. parametre pour utiliser la base systeme de protection access
    Par ramanov dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/04/2009, 18h32
  4. Réponses: 4
    Dernier message: 03/04/2007, 15h30
  5. Comment utiliser le compte SYSTEM dans un fichier .bat
    Par DiabloZizi dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 02/03/2006, 14h45

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