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

时间:2016-06-01 20:05:53

标签: python subprocess

我正在尝试在Python 3中运行子进程并不断读取输出。

在Python 3的subprocess文档中,我看到以下内容:

  

Popen.wait(超时=无)

     

等待子进程终止。设置并返回returncode属性。   警告使用stdout = PIPE和/或stderr = PIPE 时会出现死锁   并且子进程为管道生成足够的输出   块等待OS管道缓冲区接受更多数据。使用   communication()以避免这种情况。

这让我觉得我应该使用communicate,因为来自stdout的数据量非常大。但是,再次阅读文档会显示:

  

Popen.communicate(输入=无,超时=无)......

     

与流程交互:将数据发送到stdin。从stdout和stderr读取数据,直到达到文件结尾。

     

注意读取的数据缓冲在内存中,因此如果数据大小很大,请不要使用此方法   无限制。

所以再次看来,这样从子过程中读出标准星似乎存在问题。有人可以告诉我运行子进程并读取所有(可能是大量的)stdout的最佳/最安全的方法吗?

1 个答案:

答案 0 :(得分:2)

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

我希望它会有所帮助:)