繁体   English   中英

阻止和非阻止子进程调用

[英]Blocking and Non Blocking subprocess calls

我在subprocess.call()subprocess.Popen()subprocess.check_call()之间完全混淆。

哪个是封锁哪个不是?

我的意思是说,如果我使用subprocess.Popen() ,父进程是否等待子进程在继续执行之前return / exit

shell=True如何影响这些调用?

Popen是非阻塞的。 callcheck_call是阻塞的。 您可以通过调用其waitcommunicate方法来创建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脚本结束后还是一样。准备杀lspkill ls )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM