可能重复:
包装子进程的 stdout/stderr
在这个问题中,hanan-n询问是否有可能有一个 python 子进程输出到 stdout,同时还将输出保存在字符串中以供以后处理。这种情况下的解决方案是遍历每个输出行并手动打印它们:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
但是,此解决方案并不能推广到您希望对 stdout 和 stderr 都执行此操作的情况,同时满足以下条件:
- stdout/stderr 的输出应该分别到父进程的 stdout/stderr
- 输出应尽可能实时完成(但我只需要访问最后的字符串)
- 不应更改 stdout 和 stderr 行之间的顺序(我不太确定如果子进程以不同的时间间隔刷新其 stdout 和 stderr 缓存,这将如何工作;让我们现在假设我们将所有内容都放在包含完整的漂亮块中线?)
我查看了子流程文档,但找不到任何可以实现这一目标的东西。我能找到的最接近的方法是添加stderr=subprocess.stdout
和使用与上面相同的解决方案,但是我们失去了常规输出和错误之间的区别。有任何想法吗?我猜这个解决方案——如果有的话——将涉及对p.stdout
and进行异步读取p.stderr
。
这是我想做的一个例子:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command's stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]