我之间是完全混淆subprocess.call()
,subprocess.Popen()
,subprocess.check_call()
。
哪个是阻塞的,哪个不是?
我的意思是说我subprocess.Popen()
是否使用父进程是否等待子进程继续执行之前return
/ exit
。
如何shell=True
影响这些电话?
我之间是完全混淆subprocess.call()
,subprocess.Popen()
,subprocess.check_call()
。
哪个是阻塞的,哪个不是?
我的意思是说我subprocess.Popen()
是否使用父进程是否等待子进程继续执行之前return
/ exit
。
如何shell=True
影响这些电话?
Answers:
Popen
是非阻塞的。call
并且check_call
正在封锁。您可以Popen
通过调用其实例wait
或communicate
方法来制作实例块。
如果您查看源代码,则会看到call
calls Popen(...).wait()
,这就是它被阻止的原因。
check_call
call call
,这也是它也会阻止的原因。
严格来说,shell=True
与阻塞问题正交。但是,这shell=True
会导致Python执行Shell,然后在Shell中运行命令。如果使用阻塞调用,则该调用将在外壳程序完成时返回。由于外壳程序可能会生成一个子进程来运行命令,因此外壳程序可能会在生成的子进程之前完成。例如,
import subprocess
import time
proc = subprocess.Popen('ls -lRa /', shell=True)
time.sleep(3)
proc.terminate()
proc.wait()
这里生成了两个进程:Popen生成了一个运行Shell的子进程。外壳反过来产生一个正在运行的子进程ls
。 proc.terminate()
杀死外壳程序,但子进程ls
仍在运行。(这是由丰富的输出表现,在python脚本结束后还是一样。准备杀ls
用pkill ls
。)
start_new_session=True
或其类似物可立即终止整个过程树。请参阅如何终止以shell = True启动的python子进程
proc = subprocess.Popen(['/run_python.py', '-n', '10'], shell=True)
不同的是,proc = subprocess.Popen("run_python.py -n 10", shell=True)
如果命令是基于python脚本构建的,则只有最后一个可以工作。
proc = subprocess.Popen(['/run_python.py', '-n', '10'], shell=False)
这是一个阻止过程吗?我run_python.py
在后台运行,可能会持续1个小时。
Popen
始终是非阻塞的。它正在调用wait
或communicate
阻止。
subprocess.call([cmd,params,&])
吗?