Question

Mon code python fraie le processus de l'enfant, et il imprime des messages à la fois stdout et stderr. Je dois les imprimer différemment.

Je le code suivant pour traiter des enfants spawn et obtenir le résultat stdout de celui-ci.

cmd = ["vsmake.exe", "-f"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
    print line,
    sys.stdout.flush()
    pass
p.wait()

Comment puis-je modifier le code pour vérifier si les impressions de processus enfant à travers un message stderr aussi?

AJOUTÉE

Je dois imprimer le stderr et stdout dès que les impressions de processus enfant sur quelque chose. Et il est multi plate-forme mise en œuvre, il devrait fonctionner sur Mac / Linux / PC.

Était-ce utile?

La solution

p = Popen(cmd, bufsize=1024,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
p.stdin.close()
print p.stdout.read() #This will print the standard output from the spawned process
print p.stderr.read() #This is what you need, error output <-----

Donc, fondamentalement, la sortie d'erreur est redirigé vers la Pipe stderr.

Si vous avez besoin de quelque chose en temps réel dans le temps. I lignes moyennes imprimées dès que l'impression de processus donné naissance à quelque chose à stdout orstderr` alors vous pouvez faire quelque chose comme:

def print_pipe(type_pipe,pipe):
    for line in iter(pipe.readline, ''):
         print "[%s] %s"%(type_pipe,line),

p = Popen(cmd, bufsize=1024,
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)

t1 = Thread(target=print_pipe, args=("stdout",p.stdout,))
t1.start()
t2 = Thread(target=print_pipe, args=("stderr",p.stderr,))
t2.start()

#optionally you can join the threads to wait till p is done. This is avoidable but it 
# really depends on the application.
t1.join()
t2.join()

Dans ce cas, deux fils imprimera chaque fois qu'une ligne est écrite soit à stdout ou stderr. Le paramètre type_pipe fait juste la distinction lorsque les lignes sont imprimées savoir s'ils viennent stderr ou stdout.

Autres conseils

La meilleure façon de faire cette plate-forme, indépendamment utilise des fils (malheureusement). Voici quelques exemples de code:

def redirect_to_stdout(stream):
    for line in stream:
        sys.stdout.write(line)
        sys.stdout.flush()

cmd = ["vsmake.exe", "-f"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stderr_thread = threading.Thread(target=redirect_to_stdout, args=(p.stderr,))
stderr_thread.start()
redirect_to_stdout(p.stdout)
p.wait()
stderr_thread.join()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top