非常困惑。使用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?
答案 0 :(得分:1)
您似乎可能尝试将数据写入子进程(通过STDIN)以及以交互方式读取其输出(通过STDOUT)。
如this SO question的回答所述,这是禁忌!
您可以使用Popen.communicate
,但这是一个阻止调用,等待所有通信完成(您不能像在示例中那样进行轮询)