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("程序已关闭")