子流程.Popen:分离stdout/stderr但保留ord

2024-04-23 10:03:12 发布

您现在位置:Python中文网/ 问答频道 /正文

如何使用命令获取输出子流程.Popen并且对stdout和stderr有单独的回调,但是要确保这些回调是按照来自进程的行的顺序调用的?在

如果我不想分离STDOUT和STDERR,那么我可以:

fd = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
line = fd.stdout.readline()
while line :
    callback( line )
    line = fd.stdout.readline()

但是,如果我有stdoutCallbackstderrCallback,并希望它们在适当的输出上被调用,但是按照与上面代码调用callback相同的顺序,我该怎么做呢?在


Tags: 命令cmdreadline进程stderrstdoutlinecallback
3条回答
fd = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
output,error = fd.communicate()

使用communicate

这是不可能的。如果对不同的文件执行writes,则没有定义顺序。在

如果writes到stdout,stderr转到同一个地方(就像您的stdout=PIPE, stderr=STDOUT案例中一样),您可以获得正确的顺序。在

如果“近似”顺序就足够了,这里是simple code example with threads,这里是{a2}。在

所以我想我已经有了自己的一些线索。在

对于下面的示例,test.py是这样的:

#!/usr/bin/python -u

import sys
import time

sys.stdout.write("stdout 1\n")
time.sleep(1)
sys.stderr.write("stderr 2\n")
time.sleep(1)
sys.stdout.write("stdout 3\n")
time.sleep(1)
sys.stderr.write("stderr 4\n")
time.sleep(1)

我获得正确输出的代码是:

^{pr2}$

我完全可以想象一个stderr行与stdout行混淆的情况,但是出于我想要它的目的,它肯定是有效的。(我把它作为日志模块的一部分,该模块将运行一个命令,并对stdout和stderr使用不同的日志级别。)

相关问题 更多 >