如何通过批处理启动Windows应用并让应用在脚本结束后持续运行?
问题描述
我有一个Windows应用,必须通过.bat文件启动——该批处理脚本在启动目标.exe前会先调用其他程序。目前遇到的问题是:批处理脚本执行完毕退出后,启动的应用也随之关闭。我尝试过几种Python调用方式,但都没解决:
- 使用
subprocess.Popen并添加DETACHED_PROCESS参数,但time.sleep结束后exe仍会关闭:subprocess.Popen(['cd','path\to\the\script', '&&', 'start.bat' ], shell=True, text=True | subprocess.DETACHED_PROCESS ) time.sleep(10) - 尝试过
subprocess.CREATE_NEW_PROCESS_GROUP参数,以及os.system调用:os.system('cd "path\to\the\script" && "start.bat"')
需求:找到能让bat启动后应用持续运行的方法,不能直接调用exe,也不想在Python里加无限循环。
解决方案1:修改.bat文件的启动逻辑
问题核心是:默认情况下,bat中直接启动的exe会作为bat的子进程,bat退出时会终止所有子进程。用start命令启动exe可以让它脱离bat的进程组,独立运行。
将bat中启动exe的行,从:
myapp.exe
修改为:
start "" "myapp.exe"
- 空双引号是
start命令的必填占位符(作为窗口标题),避免路径含空格时解析错误。 - 如果不需要新开控制台窗口,添加
/B参数:start /B "" "myapp.exe"
修改后,无论用哪种Python方式调用bat,bat执行完毕退出后,exe都会继续运行。
解决方案2:调整Python的subprocess调用参数
如果无法修改bat文件,可通过调整Python的调用参数,让bat和exe完全脱离Python进程的控制:
方式一:新开控制台窗口
import subprocess subprocess.Popen( "start.bat", cwd="path\\to\\the\\script", # 直接设置bat所在目录,替代cd命令 shell=True, creationflags=subprocess.CREATE_NEW_CONSOLE | subprocess.DETACHED_PROCESS )
CREATE_NEW_CONSOLE为bat创建独立控制台,DETACHED_PROCESS让进程脱离Python父进程,Python退出后bat和exe不受影响,bat执行完后exe也不会被关闭。
方式二:不新开控制台窗口
import subprocess subprocess.Popen( "start.bat", cwd="path\\to\\the\\script", shell=True, creationflags=subprocess.DETACHED_PROCESS | subprocess.CREATE_NO_WINDOW, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, stdin=subprocess.DEVNULL )
- 重定向标准输入输出到空,避免残留句柄导致进程被挂起,同时不生成新窗口。
内容的提问来源于stack exchange,提问作者DeadlyHigh
相关产品推荐
相关产品推荐

