Python subprocess.Popen stdin干扰stdout / stderr

时间:2011-10-03 18:01:06

标签: python subprocess popen

非常困惑。使用Popen时,如果只使用stdout或stderr,则以下代码有效:

def run(self):
    self.externalProcess = subprocess.Popen(['./external_process.out 1>&2'], shell=True, stderr=subprocess.PIPE)
    while self.externalBinary.poll() is None:
        print('Still running')
    print('Done running')

我正在使用stderr文件描述符,因为我正在GUI中实时监视进程输出,而stderr是无缓冲的。有关该混乱的更多背景,请参阅我的其他问题: Python capture stdout from subprocess line by line

我在这里遇到的问题是,只要我添加stdin以允许用户输入传递给外部进程,它就会像stdout再次缓冲一样起作用:

def run(self):
    self.externalProcess = subprocess.Popen(['./external_process.out 1>&2'], shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    while self.externalBinary.poll() is None:
        print('Still running')
    print('Done running')

我的问题是为什么stdin似乎影响了stdout和stderr?

1 个答案:

答案 0 :(得分:1)

您似乎可能尝试将数据写入子进程(通过STDIN)以及以交互方式读取其输出(通过STDOUT)。

this SO question的回答所述,这是禁忌!

您可以使用Popen.communicate,但这是一个阻止调用,等待所有通信完成(您不能像在示例中那样进行轮询)