阻塞和不阻塞子stream程调用
我完全混淆了subprocess.call() , subprocess.Popen() , subprocess.check_call() 。
哪个是阻塞的,哪个不是?
我的意思是说,如果我使用subprocess.Popen()父进程是否等待subprocessreturn / exit然后继续执行。
shell=True如何影响这些调用?
Popen是无阻塞的。 call和check_call被阻塞。 您可以通过调用其wait或communicate方法来创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的子ls 。 proc.terminate()杀死shell,但运行ls的子proc.terminate()保持不变。 (即使在python脚本结束之后,也可以通过丰富的输出来performance出来,准备用pkill ls来杀死pkill ls )