subprocess.Popen执行程序以及关闭进程

python中有一个很好用的方式来开启进程,即subprocess.Popen

正常来说,如果subprocess.Popen要执行的脚本是一个死循环的脚本,那么我们就需要手动的来关闭这个脚本,而无法等待这个脚本自己结束。

但是这个subprocess.Popen在关闭脚本进程时有一个坑。

举例说明:

python cmd= “python demo.py”
Popen = subprocess.Popen(logcmd, stdout = subprocess.PIPE, shell=True)

用上面的方法来执行python demo.py,它的实际原理是另外开启一个cmd命令来运行python demo.py的命令,即使后面用popen.terminate()也只能关闭cmd的命令,cmd命令被kill掉后,python demo.py的线程由系统来托管,杀死不了python demo.py的进程,从而导致python demo.py不能退出.

正确的开启和关闭方法:

(1)开启方式:

import subprocess,os
import signal

cmd = "python demo.py"
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=-1,preexec_fn=os.setsid)

备注:preexec_fn=os.setsid一定要写上

(2)关闭方式:

proc.terminate()
proc.wait()
os.killpg(proc.pid, signal.SIGTERM) 
print("程序已关闭")

你可能感兴趣的:(python,python)