使用具有大量输出到标准输出的子进程时,Python代码挂起

使用具有大量输出到标准输出的子进程时,Python代码挂起,python,subprocess,stdout,Python,Subprocess,Stdout,我有一个子流程,可以将大量数据输出到stdout。当生成太多数据时,会导致子进程挂起,因为它正在等待标准输出缓冲区清空 下面是一个小例子 test.py #!/usr/local/bin/python2.7 # test.py import subprocess proc = subprocess.Popen(["python","./_ping_con.py"], stdout = subp.PIPE) while proc.poll() is None: pass prin

我有一个子流程,可以将大量数据输出到stdout。当生成太多数据时,会导致子进程挂起,因为它正在等待标准输出缓冲区清空

下面是一个小例子

test.py

#!/usr/local/bin/python2.7

# test.py

import subprocess

proc = subprocess.Popen(["python","./_ping_con.py"], stdout = subp.PIPE)

while proc.poll() is None:
    pass

print proc.stdout.read()
…以及子流程:

#!/usr/local/bin/python2.7

# _ping_con.py

print(96000 * "*")   # Hangs here because it's too much data for the stdout pipe

我想知道的是,这个缓冲区是否可以扩展以允许处理更多的数据?如果没有,是否有其他方法可以避免此问题?或者在主进程中,有没有办法判断标准输出缓冲区是否已满并进行读取?

我最后做的是将所有输出写入一个临时文件,然后将文件名传递回父文件。效果很好

相关:这是一个已知的错误:“注意,当使用stdout=PIPE或stderr=PIPE时,这将导致死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。使用管道时使用Popen.communicate()可避免此情况。”@rdas,known,yes。我不确定这是否是一个bug——它的行为符合设计和文档记录。虽然这可能有效,但实际上没有修复任何问题。只是掩盖了问题。您应该按照@rdas commentation修复它如果在我使用完之前关闭管道,那么使用Popen.communicate()有什么帮助?这就是我在网上查找使用它的简单示例时发现的。我的应用程序不要求我通过管道传递数据。