子进程挂起等待

时间:2016-05-25 16:32:20

标签: python linux

Popen.wait()的文档中,我看到了

  

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

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

然而,我注意到的是

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

会挂起。

虽然

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

不会挂起。

如果command产生大量标准输出,为什么第二个语句不会挂起,因为我们仍在使用stdout=subprocess.PIPE

1 个答案:

答案 0 :(得分:0)

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

在前一种情况下,标准错误被重定向到标准输出,标准输出通过管道传输到您的程序。因此,标准错误产生的大量数据会给标准输出上产生的大量数据带来相同的结果。

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