Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 阻塞和非阻塞子进程调用_Python_Python 3.x_Python 2.7_Subprocess - Fatal编程技术网

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
calls
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脚本结束后,也可以通过大量的输出来证明这一点。准备好用
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 so
proc=subprocess.Popen(['/run_python.py','-n',10'],shell=False)
这是一个阻塞过程吗?I
run_python.py
在后台运行,可能会持续1小时。@dotslash:
Popen
始终是非阻塞的。它正在调用
wait
communicate
哪个模块。您是否尝试了
子流程。调用([cmd,params,&])