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

Python Windows服务报错0xC0000003 SvcRun()方法执行失败如何解决?

错误根本原因
  • 第一,Windows服务没有关联控制台环境,代码里的os.system('cls')、print()方法在服务模式下调用会直接触发异常,调试模式下有控制台所以运行正常。
  • 第二,内层while CurrentValues.is_moving()是死循环:CurrentValues的数值仅在外层循环每次采集设备数据时才更新,只要首次判断传送带处于运行状态,就会无限循环执行数据库插入操作,既不会更新采集数据、也不会等待10秒,瞬间耗尽数据库连接资源和系统内存,导致服务崩溃。
  • 第三,数据库操作没有异常捕获机制,也没有手动关闭连接、游标,资源泄漏后触发的异常无法被正常打印,所以只返回无traceback的报错。
  • 第四,执行的无效SELECT * FROM MStudioDB.dbo.PowderSystem语句没有实际作用,白白消耗数据库性能。
修复方案
  1. 删掉所有控制台相关代码:cls()函数定义、所有print()调用、os.system相关逻辑。
  2. 删掉内层的while CurrentValues.is_moving()循环,改成单次判断,符合每10秒采集一次写入一次的设计逻辑。
  3. 增加异常捕获逻辑,将异常写入系统事件日志方便排查。
  4. 用上下文管理器自动处理pyodbc连接、游标回收,避免资源泄漏。
  5. 删掉无效的SELECT查询语句。
  6. 外层循环增加服务停止信号检测,避免服务无法正常停止。
核心代码修改示例
# 删掉原有的cls()、print_current_values()、print_datalog_values()三个函数定义
# 原输出和数据库操作部分替换为以下逻辑
if CurrentValues.is_moving():
    try:
        conn_str = (
            r'DRIVER={SQL Server};'
            r'SERVER=xxx;'
            r'DATABASE=MStudioDB;'
            r'UID=xxx;'
            r'PWD=xxx;'
        )
        # 用with自动管理连接和游标,结束后自动释放资源
        with pyodbc.connect(conn_str) as cnxn:
            with cnxn.cursor() as cursor:
                cursor.execute('''INSERT INTO MStudioDB.dbo.PowderSystem(Date, Move, SprayPumpRunning, SprayBurn1Running, 
                SprayBurn2Running, SprayTemp1Act, SprayTemp2Act, DryBurnerRunning, DryTempAct, PowderFanRunning, 
                CuringBurnerRunning, CuringTempAct, LiveSpeedConv, SetSpeedConv) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
                ?, ?, ?);''', (now,
                               CurrentValues.is_moving(),
                               CurrentValues.spraypumprunning,
                               CurrentValues.sprayburn1running,
                               CurrentValues.sprayburn2running,
                               int(CurrentValues.spraytemp1act),
                               int(CurrentValues.spraytemp2act),
                               CurrentValues.dryburnerrunning,
                               int(CurrentValues.drytempact),
                               CurrentValues.powderfanrunning,
                               CurrentValues.curingburnerrunning,
                               int(CurrentValues.curingtempact),
                               int(CurrentValues.convspeedact),
                               int(DatalogValues.convspeedset)))
            cnxn.commit()
    except Exception as e:
        # 把异常写入Windows系统事件日志,方便后续排查问题
        servicemanager.LogErrorMsg(f"数据库写入失败: {str(e)}")

# 检测服务停止信号,避免服务无法正常响应停止指令
if win32event.WaitForSingleObject(self.hWaitStop, 1000) == win32event.WAIT_OBJECT_0:
    break
time.sleep(9) # 叠加前面等待的1秒,总采集间隔为10秒

内容的提问来源于stack exchange,提问作者NoodlesUK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 02:06:03