Python调用subprocess启动外部程序后无法退出且连带关闭子进程怎么办
问题原因
subprocess.call() 为阻塞调用,会等待目标进程完全退出后才会返回结果,所以你的Python程序会一直停在调用位置无法继续执行。而默认场景下你调用启动的程序属于Python进程的子进程,父进程退出时会主动终止关联的子进程,所以会出现关Python连带关Minecraft启动器的问题。
解决方案
改用 subprocess.Popen() 异步启动进程,同时配置参数让目标进程完全脱离Python主进程控制,启动后直接退出Python即可。
Windows环境下的正确实现代码如下:
import subprocess if app == "M": # 路径加r前缀转为原始字符串,避免反斜杠转义异常 launcher_path = r'C:\Program Files (x86)\Minecraft Launcher\MinecraftLauncher.exe' # 异步启动独立进程 subprocess.Popen( launcher_path, creationflags=subprocess.DETACHED_PROCESS, close_fds=True ) # 启动完成直接退出程序 exit()
参数说明
subprocess.Popen是非阻塞进程调用方法,调用后立刻返回,无需等待目标进程运行结束creationflags=subprocess.DETACHED_PROCESS是Windows平台专属参数,可让启动的进程脱离父进程控制台,父进程退出不会对子进程产生任何影响close_fds=True会切断两个进程之间的文件描述符继承,进一步解除进程关联
内容的提问来源于stack exchange,提问作者Calax
相关产品推荐
相关产品推荐

