【问题标题】:When should I use `wait` instead of `communicate` in subprocess?我什么时候应该在子进程中使用`wait`而不是`communicate`?
【发布时间】:2012-11-11 10:24:03
【问题描述】:

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

警告

当使用 stdout=PIPE 和/或 stderr=PIPE 和 子进程向管道生成足够的输出,使其阻塞 等待操作系统管道缓冲区接受更多数据。使用通信() 避免这种情况。

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

对吗?谢谢!

【问题讨论】:

  • communicate 是一种方便的方法,它隐藏了使用轮询、选择或线程 (Windows) 对管道进行读/写的平台相关细节。它最后调用wait。如果它适合您的需要,请使用它,但更复杂的管道可能需要手动处理管道,或使用中间 wait
  • @eryksun wait()的性能会比communicate()更好吗?
  • 我可以想象这样一种情况,您决定在子进程完成运行之前关闭子进程的管道。当(稍后)您想确保它已完成时,wait() 将起作用,但不是communicate(),因为它会被已经关闭的管道混淆。

标签: python subprocess pipe wait communicate


【解决方案1】:

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

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

在一个实用的笔记中,我曾交流过(至少在 2.4 中)给我每行一个字符,这些字符来自基于行输出的程序,委婉地说这没有用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-09
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多