阻止和非阻止子进程调用

时间:2014-02-21 14:02:56

标签: python python-3.x python-2.7 subprocess

我对subprocess.call()subprocess.Popen()subprocess.check_call()感到困惑。

哪个是封锁哪个不是?

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

shell=True如何影响这些来电?

1 个答案:

答案 0 :(得分:79)

Popen是非阻止的。 callcheck_call正在阻止。 您可以通过调用Popenwait方法来设置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。)