我应该使用Popen';在Python3中,是等待还是通信来读取子进程中的标准输出?
我试图在Python3中运行一个子进程并不断读取输出 在Python 3中的我应该使用Popen';在Python3中,是等待还是通信来读取子进程中的标准输出?,python,subprocess,Python,Subprocess,我试图在Python3中运行一个子进程并不断读取输出 在Python 3中的子流程文档中,我看到了以下内容: Popen.wait(超时=无) 等待子进程终止。设置并返回returncode属性。 警告当使用stdout=PIPE和/或stderr=PIPE时,这将死锁 子进程生成足够的输出到管道,以便 等待OS管道缓冲区接受更多数据的块。使用 沟通()以避免这种情况 这让我觉得我应该使用通信,因为来自stdout的数据量相当大。但是,再次阅读文档会发现: 通信(输入=无,超时=无) 与进程交互
子流程
文档中,我看到了以下内容:
Popen.wait(超时=无)
等待子进程终止。设置并返回returncode属性。
警告当使用stdout=PIPE和/或stderr=PIPE时,这将死锁
子进程生成足够的输出到管道,以便
等待OS管道缓冲区接受更多数据的块。使用
沟通()以避免这种情况
这让我觉得我应该使用通信,因为来自stdout的数据量相当大。但是,再次阅读文档会发现:
通信(输入=无,超时=无)
与进程交互:向stdin发送数据。从stdout和stderr读取数据,直到到达文件末尾
注意,读取的数据缓冲在内存中,因此,如果数据大小较大或
无限制。
因此,同样,以这种方式从子流程中读取starndard似乎存在问题。有人能告诉我运行子进程并读取其所有(可能大量)标准输出的最佳/最安全的方法吗?我认为您应该使用Communication。该消息警告您有关该方法默认行为的性能问题。事实上,popen构造函数中有一个buffer size参数,可以对其进行调优,以提高大数据量的性能
我希望这会有所帮助:)这两种方法都将等待流程完成,上面评论中问题的答案将向您展示如何在运行时分块处理输出。我错过了这一点。非常感谢。我也投票赞成结束这场辩论。