什么时候应该在子进程中使用`wait`而不是`communic`?

时间:2012-11-23 02:53:22

标签: python subprocess pipe wait communicate

在等待文件(http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait)中,它说:

  

警告

     

当使用stdout = PIPE和/或stderr = PIPE和时,这将会死锁   子进程为管道生成足够的输出,使其阻塞   等待OS管道缓冲区接受更多数据。使用沟通()   为了避免这种情况。

据此,如果不需要communicate,我认为wait()可以取代retcode所有用途。即使stdoutstdin不是PIPE,我也可以将wait()替换为communicate()

是吗?谢谢!

1 个答案:

答案 0 :(得分:6)

我怀疑(文档在2.6中没有明确说明)在你不使用PIPEs的情况下()减少为wait()。因此,如果您使用PIPE,则可以替换wait()。

如果您执行使用PIPE,您可以溢出内存缓冲区(请参阅communic()注释),就像您可以填充OS管道缓冲区一样,因此如果您使用任何一个都无法工作“处理大量输出。

实际上,我已经进行了沟通(至少在2.4中),从输出基于行的程序中每行给出一个字符,这对于温和地说是没用的。

另外,“不需要重新编码”是什么意思? - 我相信它就像wait()一样设置Popen.returncode。