Python打包EXE为Windows服务启动报错1053问题求助
错误原因定位
1053错误本质是Windows服务控制管理器没有在默认30秒阈值内收到服务的启动成功反馈,结合你源码可正常运行、仅打包为EXE后报错的场景,可按以下顺序排查修复:
1. 打包配置问题修复(占该类问题90%以上概率)
- 禁止使用
-F/--onefile单文件模式打包:单文件模式启动时需要先解压全部依赖到临时目录,大概率超过30秒的服务启动超时限制,改为目录模式打包即可 - 显式添加隐式依赖:
pywin32相关的服务模块servicemanager、win32timezone属于动态导入,打包工具默认不会识别,需要手动添加
如果你使用PyInstaller打包,参考命令如下:
如果你用auto-py-to-exe,在「高级」->「隐藏导入」配置项中添加上述两个模块即可pyinstaller --hidden-import=servicemanager --hidden-import=win32timezone testing.py - 不要添加
-w/--windowed参数打包:服务属于控制台程序,使用GUI模式打包会导致IO异常卡住启动流程 - 确认打包环境和系统位数匹配:64位系统需使用64位Python、64位pywin32依赖打包为64位EXE,位数不匹配会导致服务启动异常
2. 代码逻辑修复
你现有代码存在两处可能导致启动卡住的问题:
- 缺失必要导入语句:你贴出的代码未导入依赖模块,打包时会因为模块缺失卡住,需在代码头部补全导入:
import datetime import socket import win32serviceutil import win32service import win32event import servicemanager - 死循环未处理停止信号且资源泄漏:全局
WriteToFile函数的无限死循环没有退出逻辑,也没有处理服务停止信号,同时文件操作未正确释放资源,改造参考:# 改为类方法,方便获取服务实例的停止信号和运行状态 def WriteToFile(self): while self.isrunning: # 使用with上下文自动释放文件资源 with open("C:\\Users\\Public\\file.txt" , "w" , encoding="utf-8") as file: now = datetime.datetime.now() now = now.strftime("%B %d, %y %H:%M:%S") file.write(now) # 等待1秒,同时监听停止信号,避免CPU占满也能及时响应服务停止指令 win32event.WaitForSingleObject(self.hWaitStop, 1000) # main方法对应修改为调用类方法 def main(self): self.WriteToFile()
3. 权限问题排查
- 建议将输出文件路径从
C:\\file.txt改为C:\\Users\\Public\\file.txt等公共目录,默认Local System服务账户写C盘根目录可能触发UAC权限拦截导致卡住 - 安装、启动服务时必须使用管理员权限打开命令提示符,权限不足也会触发启动超时
4. 调试验证
如果按上述步骤操作后仍有问题,可直接在管理员权限的cmd中运行打包后的EXE文件,查看控制台输出的报错信息,即可定位具体问题。
内容的提问来源于stack exchange,提问作者Slazenger
相关产品推荐
相关产品推荐

