阻塞和不阻塞子stream程调用

我完全混淆了subprocess.call()subprocess.Popen()subprocess.check_call()

哪个是阻塞的,哪个不是?

我的意思是说,如果我使用subprocess.Popen()父进程是否等待subprocessreturn / exit然后继续执行。

shell=True如何影响这些调用?

Popen是无阻塞的。 callcheck_call被阻塞。 您可以通过调用其waitcommunicate方法来创buildPopen实例块。

如果你看看源代码 ,你会看到调用Popen(...).wait() ,这就是为什么它阻塞。 check_call调用call ,这也是它阻塞的原因。

严格来说, shell=True与阻塞问题是正交的。 但是, shell=True会导致Python执行一个shell,然后在shell中运行该命令。 如果您使用阻塞调用,则在shell完成后,调用将返回。 由于shell可能会产生一个subprocess来运行该命令,因此shell可能会在产生的subprocess之前完成。 例如,

 import subprocess import time proc = subprocess.Popen('ls -lRa /', shell=True) time.sleep(3) proc.terminate() proc.wait() 

这里产生了两个进程:Popen产生一个运行shell的subprocess。 shell又产生一个运行ls的子lsproc.terminate()杀死shell,但运行ls的子proc.terminate()保持不变。 (即使在python脚本结束之后,也可以通过丰富的输出来performance出来,准备用pkill ls来杀死pkill ls