阻止和非阻止子进程调用

问题描述 投票:54回答:1

我完全混淆了subprocess.call()subprocess.Popen()subprocess.check_call()

哪个是封锁哪个不是?

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

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

python python-3.x python-2.7 subprocess
1个回答
79
投票

Popen是非阻塞的。 callcheck_call正在封锁。您可以通过调用Popenwait方法来生成communicate实例块。

如果你看看the source code,你会看到call称之为Popen(...).wait(),这就是它阻挡的原因。 check_callcall,这也是它阻挡的原因。

严格地说,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。)

© www.soinside.com 2019 - 2024. All rights reserved.