Python subprocess.Popen 的stdin干扰stdout/stderr
我对此感到很困惑。当使用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这个文件描述符是因为我在一个图形界面中实时监控进程的输出,而stderr是没有缓存的。想了解更多背景信息,可以看看我其他的问题: Python如何逐行捕获子进程的stdout
我遇到的问题是,一旦我添加了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 个回答
1
看起来你可能想要同时往子进程写数据(通过标准输入STDIN)和读取它的输出(通过标准输出STDOUT),而且是以交互的方式进行。
正如在这个问题的回答中提到的,这样做是不太合适的!
你可以使用Popen.communicate
,但是这个方法会阻塞,也就是说它会等所有的交流完成后才继续执行(你不能像在你的例子中那样进行轮询)。