阻塞和不阻塞子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
)