241 votes

Constamment l'impression de sous-processus de sortie, même si le processus est en cours d'exécution

De lancer des programmes de mon Python scripts, je suis en utilisant la méthode suivante:

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)

Donc quand je lance un processus d' Process.execute("mvn clean install"), mon programme attend jusqu'à ce que le processus est terminé, et seulement puis-je obtenir la production complète de mon programme. C'est gênant si je suis en cours d'exécution d'un processus qui prend un certain temps pour terminer.

Puis-je laisser mon programme d'écriture le processus de sortie de ligne par ligne, en interrogeant le processus de sortie avant qu'il ne finisse dans une boucle ou quelque chose?

*[MODIFIER] Désolé, je n'ai pas chercher très bien avant de poster cette question. Le filetage est en fait la clé. Trouvé un exemple qui montre comment le faire: * Python Sous-Processus.Popen à partir d'un thread

313voto

tokland Points 29813

C'est un joli modèle commun:

import subprocess

popen = subprocess.Popen(["locate", "a"], stdout=subprocess.PIPE)
for line in iter(popen.stdout.readline, ""):
    print line,

Dans votre code, vous donnerait des lignes au lieu de les imprimer.

88voto

ifischer Points 4726

Ok j'ai réussi à le résoudre sans fils (toutes les suggestions pourquoi l'utilisation de threads serait mieux apprécié) à l'aide d'un extrait de cette question de l'Interception de la sortie standard d'un processus secondaire alors qu'il est en cours d'exécution

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    # Poll process for new output until finished
    while True:
        nextline = process.stdout.readline()
        if nextline == '' and process.poll() != None:
            break
        sys.stdout.write(nextline)
        sys.stdout.flush()

    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        return output
    else:
        raise ProcessException(command, exitCode, output)

6voto

user1379351 Points 128

Pour ceux qui cherchent des réponses à cette question pour obtenir la sortie standard (stdout) à partir d'un script Python noter que Python tampons de son stdout, et par conséquent, il peut prendre un certain temps pour voir la sortie standard (stdout).

Cela peut être corrigé par l'ajout, après chaque sortie standard (stdout) écrire dans la cible de script:

sys.stdout.flush()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X