16

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

警告

这将在使用 stdout=PIPE 和/或 stderr=PIPE 时发生死锁,并且子进程会向管道生成足够的输出,从而阻塞等待 OS 管道缓冲区接受更多数据。使用communicate() 来避免这种情况。

由此,我认为communicate可以替换所有不需要的if用法。甚至当or不是 PIPE 时,我也可以替换为.wait()retcodestdoutstdinwait()communicate()

那正确吗?谢谢!

4

1 回答 1

7

我怀疑(文档在 2.6 中没有明确说明)在您不使用 PIPE 的情况下,communicate() 被简化为 wait()。因此,如果您使用 PIPE,则应该可以替换 wait()。

在您使用 PIPE 的情况下,可能会溢出内存缓冲区(请参阅communicate() 注释),就像您可以填满 OS 管道缓冲区一样,因此如果您要处理大量输出,任何一个都不会工作。

在一个实际的笔记中,我已经交流过(至少在 2.4 中)给我每行一个字符,来自程序的输出是基于行的,说得委婉一点是没有用的。

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

于 2012-12-12T21:47:16.910 回答