Windows 7下将Python脚本设为服务启动时出现Error 1053错误求助
解决Windows服务启动错误1053:Python脚本转exe做服务的问题
你遇到的Error 1053本质原因是普通的Python脚本(哪怕转成exe)根本不符合Windows服务的运行规范。Windows服务要求程序必须能处理系统发送的启动、停止等控制信号,并且要维持一个持续运行的生命周期——而你的代码只是执行一次数据库插入就直接退出了,系统等不到服务的响应信号,自然就报错了。
下面是具体的解决步骤,一步步来就能搞定:
一、修改Python代码,适配Windows服务规范
你需要用pywin32库来编写符合服务要求的代码,它能帮你处理服务的生命周期管理。
- 先安装依赖:
pip install pywin32
- 把你的代码改成服务格式,示例如下(根据你的需求调整):
import win32serviceutil import win32service import win32event import servicemanager import MySQLdb import time class MySQLInsertService(win32serviceutil.ServiceFramework): # 服务的内部名称和显示名称 _svc_name_ = "MySQLInsertService" _svc_display_name_ = "定时MySQL插入服务" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) # 创建停止事件,用于接收系统的停止信号 self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) self.is_running = True def SvcStop(self): # 通知系统服务正在停止 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.is_running = False def SvcDoRun(self): # 记录服务启动日志 servicemanager.LogMsg( servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, "") ) # 这里是你的业务逻辑,如果需要周期性执行就加循环 while self.is_running: try: # 执行数据库插入操作 db = MySQLdb.connect("host", "user", "pass", "database") cursor = db.cursor() cursor.execute("Insert into table(ID,date) Values({},now())".format(10)) db.commit() cursor.close() db.close() except Exception as e: # 把错误写入日志文件,方便排查问题(记得写绝对路径) with open("C:\\service_logs\\mysql_service_error.log", "a") as f: f.write(f"{time.ctime()}: 执行出错 - {str(e)}\n") # 假设每隔60秒执行一次,根据你的需求调整间隔 time.sleep(60) if __name__ == '__main__': # 处理服务的安装、启动、停止等命令 win32serviceutil.HandleCommandLine(MySQLInsertService)
二、重新打包成exe
用PyInstaller打包时,要确保包含pywin32的相关依赖,执行命令:
pyinstaller --onefile --hidden-import win32timezone your_service_script.py
打包完成后,在dist文件夹里就能找到生成的exe文件。
三、重新创建并启动服务
- 先删除之前创建的错误服务(如果有的话):
sc delete "service_name"
- 创建新服务(注意
binPath=后面有个空格,路径要写exe的绝对路径):
sc create "MySQLInsertService" binPath= "C:\\path\\to\\your\\dist\\your_service_script.exe"
- 启动服务:
可以在services.msc里找到你的服务(显示名称是定时MySQL插入服务)右键启动,或者用命令:
sc start MySQLInsertService
额外注意事项
- MySQL权限问题:默认服务用
Local System账户运行,要确保这个账户能访问你的MySQL服务器(比如在MySQL里授权localhost或对应IP的访问权限)。如果不行,可以在服务属性里修改登录账户,用有MySQL访问权限的用户。 - 日志路径权限:日志文件的保存路径要确保服务账户有写入权限,最好用绝对路径。
- Win7兼容性:Win7对高版本Python支持有限,建议用Python3.8及以下版本,对应的
pywin32和PyInstaller也要选兼容的版本。
内容的提问来源于stack exchange,提问作者python_fan
相关产品推荐
相关产品推荐

