Python 阻塞和非阻塞子进程调用
我完全混淆了Python 阻塞和非阻塞子进程调用,python,python-3.x,python-2.7,subprocess,Python,Python 3.x,Python 2.7,Subprocess,我完全混淆了子流程.call(),子流程.Popen(),子流程.check_call() 哪个是阻塞,哪个不是 我的意思是,如果我使用subprocess.Popen()父进程是否等待子进程返回/退出,然后再继续执行 shell=True如何影响这些调用?Popen是非阻塞的呼叫和检查呼叫被阻塞。 您可以通过调用其wait或communicate方法来创建Popen实例块 如果您查看,您将看到callcallsPopen(…).wait(),这就是它被阻塞的原因。 check_call调用ca
子流程.call()
,子流程.Popen()
,子流程.check_call()
哪个是阻塞,哪个不是
我的意思是,如果我使用subprocess.Popen()
父进程是否等待子进程返回
/退出
,然后再继续执行
shell=True
如何影响这些调用?Popen
是非阻塞的<代码>呼叫和检查呼叫
被阻塞。
您可以通过调用其wait
或communicate
方法来创建Popen
实例块
如果您查看,您将看到call
callsPopen(…).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脚本结束后,也可以通过大量的输出来证明这一点。准备好用pkill ls
杀死ls
)可以立即终止整个进程树。谢谢你,你的回答对我帮助很大。P.S.proc=subprocess.Popen(['/run_python.py','-n',10',shell=True)
不同于proc=subprocess.Popen(“run_python.py-n 10',shell=True)
如果命令构建在python脚本之上,则只有最后一个命令有效。@dotsslash:shell=True
如果命令来自用户输入,则可以是a。因此,如果可能,最好使用shell=False
。使用shell=False
,在列表中提供命令及其参数:proc=subprocess.Popen(['/run_python.py','-n',10'],shell=False)
@unutbu soproc=subprocess.Popen(['/run_python.py','-n',10'],shell=False)
这是一个阻塞过程吗?Irun_python.py
在后台运行,可能会持续1小时。@dotslash:Popen
始终是非阻塞的。它正在调用wait
或communicate
哪个模块。您是否尝试了子流程。调用([cmd,params,&])
?