首页 文章

我是否应该使用Popen的等待或通信来读取Python 3中的子进程中的stdout? [重复]

提问于
浏览
1

这个问题在这里已有答案:

我试图在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 回答

  • 2

    我认为你应该使用沟通 . 该消息警告您方法的默认行为的性能问题 . 事实上,popen构造函数有一个缓冲区大小参数,可以调整它以提高大数据量的大量性能 .

    我希望它会有所帮助:)

相关问题