阻塞和非阻塞子流程调用
我之间是完全混淆subprocess.call()
,subprocess.Popen()
,subprocess.check_call()
。
哪个是阻塞的,哪个不是?
我的意思是说我subprocess.Popen()
是否使用父进程是否等待子进程继续执行之前return
/ exit
。
如何shell=True
影响这些电话?
-
Popen
是非阻塞的。call
并且check_call
正在封锁。您可以Popen
通过调用其实例wait
或communicate
方法来制作实例块。如果您查看源代码,则会看到
call
calls
Popen(...).wait()
,这就是它被阻止的原因。check_call
callcall
,这也是它也会阻止的原因。严格来说,
shell=True
与阻塞问题正交。但是,这shell=True
会导致Python执行shell,然后在shell中运行命令。如果使用阻塞调用,则该调用将在
外壳程序 完成时返回。由于外壳程序可能会生成一个子进程来运行命令,因此外壳程序可能会在生成的子进程之前完成。例如,import subprocess import time proc = subprocess.Popen('ls -lRa /', shell=True) time.sleep(3) proc.terminate() proc.wait()
这里生成了两个进程:Popen生成了一个运行Shell的子进程。外壳反过来产生一个正在运行的子进程
ls
。
proc.terminate()
杀死外壳程序,但子进程ls
仍在运行。(这是由丰富的输出表现,在python脚本结束后还是一样。准备杀ls
用pkill ls
。)