6

私のPythonコードは子プロセスを生成し、stdoutとstderrの両方のメッセージを出力します。別の方法で印刷する必要があります。

子プロセスを生成し、そこからstdoutの結果を取得するための次のコードがあります。

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()

子プロセスがstderrを介してメッセージを出力するかどうかを確認するために、コードを変更するにはどうすればよいですか?

追加した

子プロセスが何かを出力したらすぐに、stderrとstdoutを印刷する必要があります。また、クロスプラットフォームの実装であるため、Mac / Linux/PCで実行する必要があります。

4

2 に答える 2

7
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 <-----

したがって、基本的にエラー出力はstderrパイプにリダイレクトされます。

もっとリアルタイムで何かが必要な場合。つまり、生成されたプロセスがstdout orstderr`に何かを出力するとすぐに印刷される行は、次のように実行できます。

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()

stdoutこの場合、行がまたはに書き込まれるたびに2つのスレッドが出力されますstderr。このパラメータは、行が印刷されるときに区別して、行がまたはtype_pipeから来ているかどうかを認識します。stderrstdout

于 2011-01-26T14:26:18.550 に答える
1

このプラットフォームを独立して実行する最も簡単な方法は、スレッドを使用することです(残念ながら)。次にいくつかのサンプルコードを示します。

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()
于 2011-01-26T14:58:53.547 に答える