子のプロセスからのメッセージの処理Pythonで徹底的なstderrとstdout
-
24-10-2019 - |
質問
私の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()
Child ProcessがSTDERRを介してメッセージを印刷するかどうかを確認するためにコードを変更するにはどうすればよいですか?
追加した
子プロセスが何かを印刷するとすぐに、StderrとStdoutを印刷する必要があります。また、クロスプラットフォームの実装であるため、Mac/Linux/PCで実行する必要があります。
解決
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 or
stderr`それからあなたは次のようなことをすることができます:
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()
この場合、2つのスレッドが行われるたびに印刷されます。 stdout
また stderr
. 。パラメーター type_pipe
線が印刷されたときに区別します。 stderr
また stdout
.
他のヒント
このプラットフォームを独立して行う最も簡単な方法は、スレッドを使用することです(残念ながら)。これがコードの例です。
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()
所属していません StackOverflow