Ros*_*hta 61 python subprocess python-2.7 python-3.x
我之间是完全糊涂了subprocess.call(),subprocess.Popen(),subprocess.check_call().
哪个是封锁哪个不是?
如果我用我的意思说的是subprocess.Popen()父进程是否等待子进程return/ exit它继续执行之前.
shell=True这些电话怎么影响?
unu*_*tbu 90
Popen是非阻塞的.call并且check_call正在阻止.您可以Popen通过调用其wait或communicate方法来创建实例块.
如果您查看源代码,您将看到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()
Run Code Online (Sandbox Code Playgroud)
这里产生了两个进程:Popen生成一个运行shell的子进程.shell反过来产生一个子进程运行ls. proc.terminate()杀死shell,但子进程ls仍在运行.(这是由丰富的输出表现,在python脚本结束后也.准备杀死ls同pkill ls.)