auto_py_to_exe打包后NSSM安装Python服务启动失败(错误码3)
解决打包exe后Windows服务启动错误码3的问题
错误原因分析
Windows服务错误码3表示系统找不到指定的文件或路径,你的场景里主要是以下几个问题导致:
- 打包后仍依赖原虚拟环境的Python解释器,目标环境中该路径不存在;
- 服务工作目录配置错误,导致找不到配置文件或依赖;
- 命令中的引号转义问题,导致subprocess执行时解析错误;
- 打包时未包含必要的依赖文件(如配置文件)。
具体解决方案
1. 修改服务安装命令,直接指向打包后的exe
原命令调用虚拟环境的python.exe执行脚本,打包成exe后应直接用生成的exe作为服务执行程序,脱离外部Python环境:
cmds = [ [ "C:/RT_Apps/RT_SIP_Sounder/config/nssm", "install", "RT SIP Alert", "C:/你的打包输出目录/xxx.exe" # 替换为实际的exe路径 ] ] for cmd in cmds: subprocess.run(cmd, cwd="C:/RT_Apps/RT_SIP_Sounder/config", stdout=subprocess.PIPE) print(f"CMD RUN: {' '.join(cmd)} ") time.sleep(3)
注意:打包时推荐选择
onedir模式(多文件打包),相比onefile(单文件),路径问题更易排查和处理。
2. 强制设置服务的工作目录
服务启动时的默认工作目录可能不是配置文件所在路径,需手动指定:
# 安装服务后执行该命令设置工作目录 nssm set "RT SIP Alert" AppDirectory "C:/RT_Apps/RT_SIP_Sounder/config"
确保服务启动时能读取到配置文件。
3. 打包时包含所有依赖文件
在auto_py_to_exe的配置中,将配置文件、必要的资源文件添加到Additional Files区域,确保打包后这些文件和exe处于同一目录(或你指定的路径),避免服务启动时找不到依赖。
4. 用列表形式传递subprocess命令
原代码中用字符串形式传递命令,存在引号转义风险,改用列表形式传参,subprocess会自动处理空格和引号,避免解析错误。
5. 查看服务日志定位具体问题
通过nssm编辑服务配置,开启日志记录:
nssm edit "RT SIP Alert"
切换到Logging标签,设置日志文件的保存路径,启动服务后查看日志,能精准定位是找不到exe、配置文件还是其他依赖。
内容的提问来源于stack exchange,提问作者cmrussell
相关产品推荐
相关产品推荐

