Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该使用Popen';在Python3中,是等待还是通信来读取子进程中的标准输出?_Python_Subprocess - Fatal编程技术网

我应该使用Popen';在Python3中,是等待还是通信来读取子进程中的标准输出?

我应该使用Popen';在Python3中,是等待还是通信来读取子进程中的标准输出?,python,subprocess,Python,Subprocess,我试图在Python3中运行一个子进程并不断读取输出 在Python 3中的子流程文档中,我看到了以下内容: Popen.wait(超时=无) 等待子进程终止。设置并返回returncode属性。 警告当使用stdout=PIPE和/或stderr=PIPE时,这将死锁 子进程生成足够的输出到管道,以便 等待OS管道缓冲区接受更多数据的块。使用 沟通()以避免这种情况 这让我觉得我应该使用通信,因为来自stdout的数据量相当大。但是,再次阅读文档会发现: 通信(输入=无,超时=无) 与进程交互

我试图在Python3中运行一个子进程并不断读取输出

在Python 3中的
子流程
文档中,我看到了以下内容:

Popen.wait(超时=无)

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

这让我觉得我应该使用
通信
,因为来自stdout的数据量相当大。但是,再次阅读文档会发现:

通信(输入=无,超时=无)

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

注意,读取的数据缓冲在内存中,因此,如果数据大小较大或 无限制。


因此,同样,以这种方式从子流程中读取starndard似乎存在问题。有人能告诉我运行子进程并读取其所有(可能大量)标准输出的最佳/最安全的方法吗?

我认为您应该使用Communication。该消息警告您有关该方法默认行为的性能问题。事实上,popen构造函数中有一个buffer size参数,可以对其进行调优,以提高大数据量的性能


我希望这会有所帮助:)

这两种方法都将等待流程完成,上面评论中问题的答案将向您展示如何在运行时分块处理输出。我错过了这一点。非常感谢。我也投票赞成结束这场辩论。