Python通过subprocess.Popen启动的进程如何在主程序退出后保持存活
问题根因
start_new_session=True是POSIX系统(Linux/macOS等)专属参数,Windows平台无对应实现,添加后不会生效。Windows下子进程默认关联父进程生命周期,父进程退出时系统会默认终止同进程组内的所有子进程。
解决方案
通过Windows专属的进程创建标志实现子进程完全独立,修改代码如下:
import subprocess from subprocess import DETACHED_PROCESS, CREATE_NEW_PROCESS_GROUP app_path = r'C:\Users\myusername\AppData\Local\Discord\app-1.0.9001\discord.exe' subprocess.Popen( app_path, creationflags=DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )
如果使用Python 3.7以下版本,无法直接导入上述两个常量,可以直接使用对应的十六进制数值:
subprocess.Popen( app_path, creationflags=0x00000008 | 0x00000200, # 等价于DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )
参数说明
DETACHED_PROCESS:标识子进程不依附于父进程的控制台,父进程退出不会触发子进程的关联终止逻辑CREATE_NEW_PROCESS_GROUP:为子进程单独创建独立进程组,脱离父进程的进程生命周期管理- 标准IO重定向到
subprocess.DEVNULL:切断子进程对父进程IO句柄的继承,避免因句柄关联导致的异常退出问题
内容的提问来源于stack exchange,提问作者Kirk KD
相关产品推荐
相关产品推荐

