也许有人能在这个领域帮助我。 (我在SO上看到了许多类似的问题,但没有一个涉及标准输出和标准错误,或者处理像我这样的情况,因此提出了这个新问题。)
我有一个Python函数,它打开一个子进程,等待其完成,然后输出返回代码以及标准输出和标准错误管道的内容。 在进程运行时,我还想显示两个管道的输出,因为它们被填充。 我的第一次尝试结果是这样的:
process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout = str()
stderr = str()
returnCode = None
while True:
# collect return code and pipe info
stdoutPiece = process.stdout.read()
stdout = stdout + stdoutPiece
stderrPiece = process.stderr.read()
stderr = stderr + stderrPiece
returnCode = process.poll()
# check for the end of pipes and return code
if stdoutPiece == '' and stderrPiece == '' and returnCode != None:
return returnCode, stdout, stderr
if stdoutPiece != '': print(stdoutPiece)
if stderrPiece != '': print(stderrPiece)
然而,这里有几个问题。因为
read()
读取直到EOF
,所以while
循环的第一行不会返回直到子进程关闭管道。我可以将
read()
替换为read(int)
,但打印输出被扭曲,被截断在读取字符的末尾。我可以替代使用readline()
,但当同时有许多输出和错误时,打印输出会扭曲,输出和错误信息交替出现。也许有一种
read-until-end-of-buffer()
变量是我不知道的?或者它可以被实现?也许最好像在另一篇文章的答案中建议的那样实现一个
sys.stdout
包装器?但是我只想在这个函数中使用包装器。社区还有其他想法吗?
感谢您的帮助! :)
编辑:解决方案确实应该是跨平台的,但如果您有不跨平台的想法,请分享它们以使头脑风暴继续进行。
如果你对我的另一个Python子进程问题感到困惑,请查看我在计算子进程开销的时间上的另一个问题。
stderr
可以设置为STDOUT
,这样就可以重定向,然后您可以将stdout
设置为PIPE
,并从stdout
中读取。 - Nathan Ernst