从Popen.wait()
的文档中,我看到
警告 使用 stdout=PIPE 和/或 stderr=PIPE 时,这将死锁 子进程向管道生成足够的输出,以便 块等待 OS 管道缓冲区接受更多数据。用 通信()以避免这种情况。
我在理解下面的行为时遇到了一些麻烦,因为下面的command
运行可以生成相当大量的标准输出。
但是,我注意到的是
subproc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
会挂起。
而
subproc = subprocess.Popen(command, stdout=subprocess.PIPE)
不会挂起。
如果command
生成了大量的标准输出,为什么第二个语句不挂起,因为我们仍在使用stdout=subprocess.PIPE
?
第二个命令不会挂起,因为问题不在于标准输出上的大量数据,而在于标准错误上的大量数据。
在前一种情况下,标准错误被重定向到标准输出,该输出被管道传输到您的程序。因此,在标准误差下生成的大量数据会产生与在标准输出上生成的大量数据等效的结果。
在后一种情况下,子进程的标准错误将重定向到调用进程的标准错误,因此不会卡在管道中。