使用subprocess执行Jar文件后Python脚本挂起无法运行后续代码问题
脚本挂起修复方案
根因定位
- 错误传递shell后台符号:
subprocess.Popen调用时传入的&是shell专属的后台运行语法,在默认shell=False的模式下,该符号会被作为非法参数传递给java进程,导致进程启动异常卡住,后续代码无法执行。 - 标准错误缓冲区未处理:你仅重定向了标准输出到
DEVNULL,未处理标准错误输出。如果jar包运行过程中向标准错误输出大量内容,缓冲区占满后系统会自动阻塞该进程,导致脚本挂起。
修复代码
直接替换原有p2定义的代码行即可:
# Popen本身为异步启动,无需额外加&,同时重定向标准错误避免缓冲区阻塞 p2 = subprocess.Popen(["java", "-jar", "serverstarter-2.0.1.jar"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
修改后原有等待180秒再终止进程、清理文件的逻辑可以正常运行,不会出现挂起问题。
可选优化(非必须)
现有代码中遍历forge jar文件的逻辑存在未找到文件时变量未定义的风险,可以调整为:
forge_jar_file = glob(dest + "forge-*.jar") if forge_jar_file: os.rename(forge_jar_file[0], os.path.join(dest, "atm6.jar")) else: post_to_slack(f"Error occured in {os.path.basename(__file__)}! 未找到forge jar文件")
内容的提问来源于stack exchange,提问作者zeroerrors0945
相关产品推荐
相关产品推荐

