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