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 :

Python : Lancer un executable dans un Thread et lui envoyer des lignes de commande (executable sous DOS)


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Python : Lancer un executable dans un Thread et lui envoyer des lignes de commande (executable sous DOS)
    Bonjour à tous.

    Je dois réaliser un programme Python qui lance un exécutable (qui ouvre un terminal DOS sous windows). Cet exécutable invite ensuite l'utilisateur a entrer des lignes de commande.

    Je souhaite :
    - Lancer l'exécutable
    - Lui envoyer automatiquement des lignes de commande

    Apres avoir parcouru qq forums, je pense utiliser les threads qui permettent de ne pas bloquer le programme lorsque l'exécutable demandera des commandes.

    Pour lancer l'executable, pas de soucis j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    def launch():
        os.system("path\Monprog.exe")
     
    a=threading.Thread(target=launch)
    a.start()
    Si je mets un print quelconque apres, celui s'affiche bien et en parralèle Monprog.exe affiche un ">" dans la même fenêtre, indiquant qu'il attend une commande.

    -> Comment lui envoyer la commande "help" par exemple, depuis mon programme python ?
    -> Et enfin comment récupérer le résultat ? (pour ensuite traiter la liste des commandes que Monprog.exe va donner en réponse à "help")


    Merci d'avance pour votre aide !
    Je débute un peu sous python

  2. #2
    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,
    Je pense que vous avez d'abord un problème de conception.
    "os.system("path\Monprog.exe")" exécute un fork i.e. crée un process 'à part' dans lequel est lancé monprog.exe.

    monprog.exe et le programme appelant étant des process séparés, ajouter des threads n'apporte pas grand chose (pour l'instant).

    Comment discuter avec monprog.exe?
    La bibliothèque à utiliser est subprocess. Vous trouverez pas mal d'exemples ici pour récupérer les sorties de monprog.exe et lui expédier des commandes.
    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Ok merci beaucoup !
    Je vais creuser cette piste alors.

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Bon j'ai réussi à me débrouiller avec ça.
    Merci beaucoup !!!

    J'utilise popen2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import subprocess
     
    print '\npopen2:'
     
    proc = subprocess.Popen("path\Monprog.exe",
                            shell=True,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            )
    stdout_value = proc.communicate("help\nexit\n)[0]
    print '\tpass through:', repr(stdout_value)
    Par contre la dernière ligne d'affichage ne se fait pas si je ne mets pas "exit" dans proc.communicate(). Le buffer se remplit infiniement de " :>" si je ne mets pas la commande "exit", comme si je mettais une infinité de "\n" sans commande en paramètre de proc.communicate(). Je le vois en terminant manuellement l'exécution du processus Monprog.exe. L'affichage se fait alors et je vois le résultat de ma commande help suivit de :> :> :> :> :> :> :>....etc

    Bref ce n'est pas un probleme, j'écris toutes mes lignes de commandes séparées par des "\n" en finissant par "exit\n". Elles s'exécutent bien les unes à la suite des autres et l'affichage final se fait d'un coup (tous les résultats de mes lignes de commandes).

    Ca me va pour l'utilisation que je souhaite en faire.

    Encore merci pour votre aide !
    Bonne continuation.

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

Discussions similaires

  1. Problème python lancer un .exe dans son service windows python
    Par leyer dans le forum Général Python
    Réponses: 1
    Dernier message: 02/04/2010, 04h07
  2. [XL-2000] Lancement d'executables avec Shell, générer des lignes de commande du CMD
    Par Gautier.B dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/04/2009, 09h29
  3. Réponses: 2
    Dernier message: 04/12/2007, 08h01
  4. Réponses: 0
    Dernier message: 13/08/2007, 12h42
  5. Comment executer un script SQL a partir de la ligne de commande ?
    Par lassaad83 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/08/2007, 11h13

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