【问题标题】:Subprocess Hanging on Wait子进程挂起等待
【发布时间】:2016-09-23 09:40:36
【问题描述】:

Popen.wait()的文档中,我明白了

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

我在理解下面的行为时遇到了一些麻烦,因为下面运行的 command 会产生相当多的标准输出。

然而,我注意到的是

subproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

将挂起。

虽然

subproc = subprocess.Popen(command, stdout=subprocess.PIPE)

不会挂起。

如果command 正在生成大量标准输出,为什么第二条语句没有挂起,因为我们仍在使用stdout=subprocess.PIPE

【问题讨论】:

    标签: python linux


    【解决方案1】:

    第二条命令不会挂起,因为问题不是标准输出数据量大,而是标准错误数据量大。

    在前一种情况下,标准错误被重定向到标准输出,该输出被通过管道传送到您的程序。因此,在标准错误上产生的大量数据与在标准输出上产生的大量数据具有等效的结果。

    在后一种情况下,子进程的标准错误被重定向到调用进程的标准错误,因此不会卡在管道中。

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多