[英]Blocking and Non Blocking subprocess calls
我在subprocess.call()
, subprocess.Popen()
, subprocess.check_call()
之间完全混淆。
哪个是封锁哪个不是?
我的意思是说,如果我使用subprocess.Popen()
,父进程是否等待子进程在继续执行之前return
/ exit
。
shell=True
如何影响这些调用?
Popen
是非阻塞的。 call
和check_call
是阻塞的。 您可以通过调用其wait
或communicate
方法来创建Popen
实例块。
如果你在看源代码 ,你会看到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
的子ls
。 proc.terminate()
杀死shell,但运行ls
的子proc.terminate()
仍然存在。 (这是由丰富的输出表现,在python脚本结束后还是一样。准备杀ls
与pkill ls
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.