这个问题在这里已有答案:
我试图在Python 3中运行子进程并不断读取输出 .
在Python 3的 subprocess
文档中,我看到以下内容:
Popen.wait(timeout = None)等待子进程终止 . 设置并返回returncode属性 . 警告当使用stdout = PIPE和/或stderr = PIPE时,这将导致死锁,并且子进程会为管道生成足够的输出,以便阻止等待OS管道缓冲区接受更多数据 . 使用communic()来避免这种情况 .
这让我觉得我应该使用 communicate
,因为来自stdout的数据量非常大 . 但是,再次阅读文档会显示:
Popen.communicate(输入=无,超时=无)...与进程交互:将数据发送到stdin . 从stdout和stderr读取数据,直到达到文件结尾 . 注意读取的数据缓冲在内存中,因此如果数据大小很大或不受限制,请不要使用此方法 .
再说一遍,看起来这样从子过程中读出标准出现了问题 . 有人可以告诉我运行子进程并读取其所有(可能是大量的)stdout的最佳/最安全的方法吗?
1 回答
我认为你应该使用沟通 . 该消息警告您方法的默认行为的性能问题 . 事实上,popen构造函数有一个缓冲区大小参数,可以调整它以提高大数据量的大量性能 .
我希望它会有所帮助:)