我一直在python中寻找一个方法来将多个进程链接在一起,同时将某些中间进程的stderr重定向到字符串变量。
环顾四周后,我认为使用subprocess.popen和subprocess.communicate提供了最佳解决方案。作为示例代码如下所示:
import sys
import tempfile
from subprocess import Popen, PIPE
cmd = [sys.executable, '-c', 'print raw_input()']
# Using a temp file to give input data to the subprocess instead of stdin.write to avoid deadlocks.
with tempfile.TemporaryFile() as f:
f.write('foobar')
f.seek(0) # Return at the start of the file so that the subprocess p1 can read what we wrote.
p1 = Popen(cmd, stdin=f, stdout=PIPE)
p2 = Popen(cmd, stdin=p1.stdout, stdout=PIPE, stderr=PIPE)
p3 = Popen(cmd, stdin=p2.stdout, stdout=PIPE, stderr=PIPE)
# No order needed.
p1.stdout.close()
p2.stdout.close()
# Using communicate() instead of stdout.read to avoid deadlocks.
print p3.communicate()[0]
如果我只是将p2的stdout重定向到p3的stdin,则上面的代码可以正常工作。
但是,我还想从p2收集stderr输出并稍后处理它们。不幸的是,我找不到将p2.stderr重定向到变量的方法(在这个链接的popen情况下)。我尝试过使用p2.stderr.read()或者只是从p2.stderr获取行,但都失败了。特别是,当p2.stderr的输出很大时,它会挂起p3并且整个程序陷入死锁。
无论如何将p2.stder存储到某个变量中(因为我需要稍后处理输出)而不挂断程序?
答案 0 :(得分:0)
我遇到了类似的问题,这可能不是理想的解决方案,但您可以将输出重定向到文本文件,然后从那里读取:
tempFile = open("/tmp/myAppName.file.txt","w")
p2 = Popen(cmd, stdin=p1.stdout, stdout=PIPE, stderr=tempFile)
p2out = ""
#when you need the output, just do this:
with open("/tmp/myAppName.file.txt","r") as f:
p2out = f.read()