Python脚本调用jar文件时程序被立即终止的原因及解决方法
问题排查与修复方案
原有代码的核心问题
- 命令拼接逻辑完全不符合Windows CMD的运行规则:开启
shell=True时,subprocess会把传入的列表参数拼接为完整的CMD命令行执行。你原本传入的['D:', 'cd', PurePath(fileDirectory), 'START', '""', fileToExecute]中,手动编写的切盘符、cd目录逻辑和强制设置的cwd=os.getcwd()(Python脚本自身的运行目录)冲突,相当于让程序在Python脚本的目录下找目标jar,自然无法正常启动。 - 引号转义错误:你原本加在START后面的
'""'(空窗口标题参数),在列表传参给shell时会被错误解析,把后续的文件路径识别为以//开头的网络路径,最终触发你遇到的The network path was not found //类报错。 - 之前的托盘闪退问题:最初直接调用jar时,Java进程是作为当前CMD窗口/Python进程的子进程存在的,只要父进程(CMD/Python)退出,子进程就会被连带终止,因此会出现托盘图标弹出后立刻消失的情况。START命令的作用就是让目标程序脱离父进程的进程树,成为独立运行的进程,从根源上解决连带终止的问题。
- 那段维持脚本运行的代码无效的原因:这段代码本身没有解决jar进程的父进程关联问题,只是让Python脚本自己不退出,对已经是子进程的jar程序没有任何保护作用。
可稳定运行的实现
你最后调整的代码能正常工作的核心原因是:
- 直接把
cwd参数设置为目标jar所在的目录PurePath(fileDirectory),由Python自动处理跨盘符的工作目录切换,替代了手动切盘符、cd的冗余逻辑,也避免了jar因为找不到同目录下的配置、资源文件直接闪退(Shimeji这类jar程序高度依赖当前工作目录读取配置,工作目录不对就算启动也会立刻退出)。 - 移除了转义错误的引号参数,避免了路径被识别为网络共享路径的问题。
如果担心程序路径包含空格时START命令会误把路径第一个参数识别为窗口标题,可以正确传递空标题参数,避免解析错误,写法为:subprocess.run(['START', '', fileToExecute], cwd=PurePath(fileDirectory), shell=True)
额外注意事项
- Windows环境下用
subprocess调用CMD命令时,尽量不要手动拼接切盘符、cd目录的逻辑,直接通过cwd参数指定目标工作目录即可,Python会自动处理跨盘符的路径切换,可靠性远高于手动写CMD命令。 - 不需要依赖延长Python脚本运行时间的方式保持jar程序运行,只要通过START让jar成为独立进程,就算Python脚本提前退出,jar程序也会正常持续运行。
内容的提问来源于stack exchange,提问作者mahyellaw
相关产品推荐
相关产品推荐

