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 :

Exécuter puis récupérer la sortie d'un script Python en temps réel et non en un seul bloc


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut Exécuter puis récupérer la sortie d'un script Python en temps réel et non en un seul bloc
    Bonjour,
    voici un script tout bête nommé test.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    #coding=utf-8
    import time
    for i in range (1,5):   
        print i
        time.sleep(3)
    Je veux le lancer et récupérer les lignes écrites par le script comme dans une console classique ligne par ligne. J'ai le code suivant mais il traite la sortie en un seul bloc et non en temps réel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    #coding=utf-8
    import os
     
    import subprocess
    fileToTest = 'cheminCompletDuScriptCiDessus'
     
    os.chdir(os.path.dirname(fileToTest))
    x = subprocess.Popen( ["python.exe", fileToTest],
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE )
    print x.stdout.read()
    Comment modifier ce code pour obtenir l'affichage des lignes en temps réel ?

    Toute info. est la bienvenue.

    PS : ce post a été impulsé par la lecture de cet autre.

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Citation Envoyé par rambc Voir le message
    Bonjour,
    voici un script tout bête nommé test.py :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    #coding=utf-8
    import time
    for i in range (1,5):   
        print i
        time.sleep(3)
    Je veux le lancer et récupérer les lignes écrites par le script comme dans une console classique ligne par ligne. J'ai le code suivant mais il traite la sortie en un seul bloc et non en temps réel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env python
    #coding=utf-8
    import os
     
    import subprocess
    fileToTest = 'cheminCompletDuScriptCiDessus'
     
    os.chdir(os.path.dirname(fileToTest))
    x = subprocess.Popen( ["python.exe", fileToTest],
                          stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE )
    print x.stdout.read()
    Comment modifier ce code pour obtenir l'affichage des lignes en temps réel ?

    Toute info. est la bienvenue.

    PS : ce post a été impulsé par la lecture de cet autre.
    À mon avis, "print x.stdout.read()" écrit le contenu de stdout au moment de l'execution de la ligne...
    Tu devrais répeter plusieurs fois l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    while machintruc:
         print x.stdout.read()
    mais ça écrirait plusieurs fois la sortie... il faudrait en fait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
    while machintruc:
         print la dernière ligne de x.stdout.read()

  3. #3
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Ta méthode n'a pas de sens il me semble. C'est la façon dont on appelle la commande subprocess qui pose problème.

    Au pire, existe-t-il un autre moyen de faire ce que je souhaite ?

  4. #4
    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
    Non, la manière dont tu te sers de Popen est correcte.
    Il te suffit maintenant de faire un select sur les sorties, et de ne lire que quelques caractères à la fois depuis ces sorties.
    Un appel à read sans paramètre tente d'atteindre eof avant de retourner le résultat.

  5. #5
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Mon souci n'est pas d'afficher ligne par ligne la sortie mais bien de récupérer en temps réel et non pas une fois le fichier script.py complétèment éxécuté. Peut-être faut-il regardé du côté des thread ? Peut-être qu'on ne pense pas à la même chose.

  6. #6
    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
    Relis ce que j'ai dit et tu verras que je n'ai nulle part parlé de ligne.

    Sinon, tu peux rediriger directement la sortie du processus vers stdout.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/08/2010, 09h53
  2. Réponses: 15
    Dernier message: 15/06/2009, 17h35
  3. Réponses: 7
    Dernier message: 05/04/2007, 16h15
  4. Réponses: 5
    Dernier message: 16/03/2007, 12h16

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