Popen是非阻塞的。
call并且
check_call正在封锁。您可以
Popen通过调用其实例
wait或
communicate方法来制作实例块。
如果您查看源代码,则会看到
callcalls
Popen(...).wait(),这就是它被阻止的原因。
check_callcall
call,这也是它也会阻止的原因。
严格来说,
shell=True与阻塞问题正交。但是,这
shell=True会导致Python执行shell,然后在shell中运行命令。如果使用阻塞调用,则该调用将在
外壳程序 完成时返回。由于外壳程序可能会生成一个子进程来运行命令,因此外壳程序可能会在生成的子进程之前完成。例如,
import subprocessimport timeproc = subprocess.Popen('ls -lRa /', shell=True)time.sleep(3)proc.terminate()proc.wait()
这里生成了两个进程:Popen生成了一个运行Shell的子进程。外壳反过来产生一个正在运行的子进程
ls。
proc.terminate()杀死外壳程序,但子进程
ls仍在运行。(这是由丰富的输出表现,在python脚本结束后还是一样。准备杀
ls用
pkillls。)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)