You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 7下将Python脚本设为服务启动时出现Error 1053错误求助

解决Windows服务启动错误1053:Python脚本转exe做服务的问题

你遇到的Error 1053本质原因是普通的Python脚本(哪怕转成exe)根本不符合Windows服务的运行规范。Windows服务要求程序必须能处理系统发送的启动、停止等控制信号,并且要维持一个持续运行的生命周期——而你的代码只是执行一次数据库插入就直接退出了,系统等不到服务的响应信号,自然就报错了。

下面是具体的解决步骤,一步步来就能搞定:

一、修改Python代码,适配Windows服务规范

你需要用pywin32库来编写符合服务要求的代码,它能帮你处理服务的生命周期管理。

  1. 先安装依赖:
pip install pywin32
  1. 把你的代码改成服务格式,示例如下(根据你的需求调整):
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文件。

三、重新创建并启动服务

  1. 先删除之前创建的错误服务(如果有的话):
sc delete "service_name"
  1. 创建新服务(注意binPath=后面有个空格,路径要写exe的绝对路径):
sc create "MySQLInsertService" binPath= "C:\\path\\to\\your\\dist\\your_service_script.exe"
  1. 启动服务:
    可以在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:57:58