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

PyInstaller打包exe定时运行触发“Failed to Execute Script main”错误及Task Scheduler返回0x103代码问题求助

解决PyInstaller打包exe定时运行后突发致命错误的问题

我完全理解你的困扰——明明程序能正常跑几百次,毫无征兆就突然崩溃弹出Fatal Error: Failed to Execute Script main,任务计划还返回0x103代码。结合你的场景(定时截图+ShareFile上传),我整理了几个最可能的原因和对应的排查、解决思路:

1. PyInstaller单文件模式的临时文件泄漏

用--onefile打包的exe,每次运行都会自动解压到系统临时目录(比如%TEMP%下的_MEIxxxxxx文件夹)。如果程序某次异常退出没清理这些临时文件,长期积累下来会占满磁盘空间、耗尽文件句柄,导致后续运行时无法完成解压,直接触发致命错误。

  • 解决办法:
    • 在脚本末尾添加临时目录清理逻辑,或者在打包时加上--clean参数(不过这个是打包阶段清理,运行时还是要自己处理)
    • 自定义临时目录,避免和系统临时目录争抢资源,在脚本开头加这段代码:
      import sys
      import os
      import tempfile
      
      if hasattr(sys, '_MEIPASS'):
          # 把临时文件放到exe所在目录的专属文件夹里
          custom_temp_dir = os.path.join(os.path.dirname(sys.executable), "ScreenGrab_Temp")
          os.makedirs(custom_temp_dir, exist_ok=True)
          tempfile.tempdir = custom_temp_dir
      
    • 定期手动清理系统临时目录里以_MEI开头的文件夹

2. ShareFile连接/会话资源泄漏

你的核心操作是上传文件到ShareFile,如果每次运行没有正确关闭连接、释放会话对象,长期下来会耗尽网络连接数,或者触发ShareFile的会话上限,导致上传失败进而引发脚本崩溃。

  • 排查&修复:
    • 检查你的ShareFile操作代码,务必用with语句管理客户端实例(比如with ShareFileClient(...) as client:),或者在操作完成后手动调用client.close()
    • 在上传完成后手动触发垃圾回收,避免资源延迟释放:
      import gc
      gc.collect()
      
    • 给上传逻辑加上完整的异常捕获,比如捕获网络超时、权限错误等,记录错误信息后优雅退出,而不是让异常直接崩溃程序

3. 截图操作的资源冲突或异常

定时运行时,偶尔会遇到系统资源紧张(比如内存不足)、屏幕被锁定、其他程序占用截图API的情况,导致截图失败。如果你的脚本没有处理这类异常,就会触发未捕获的错误,弹出致命提示。

  • 解决思路:
    • 给截图代码套上try-except块,捕获你用的截图库(比如PIL、pyautogui)的所有异常,记录错误日志后正常退出
    • 观察任务管理器中exe的内存占用,如果每次运行后内存持续上涨,说明有内存泄漏,优化截图代码(比如及时关闭图片对象:img.close())
    • 如果是Windows系统,在任务计划的任务属性里勾选“唤醒计算机运行此任务”,避免屏幕锁定时截图失败

4. 任务计划0x103代码的背后含义

0x103代码通常表示“任务已请求终止”或“任务运行超时”。结合你的情况,大概率是程序运行时出现未处理异常导致系统终止进程,或者任务的默认超时时间太短(比如默认1小时),某次运行耗时超过限制被终止。

  • 排查步骤:
    • 打开任务计划,找到你的任务,进入“设置”选项卡,延长“停止任务,如果运行时间超过”的时长(比如设为30分钟)
    • 开启任务计划的详细日志记录,查看崩溃时的具体触发原因
    • 给脚本添加完整的日志功能,把每一步操作的状态、错误都写入日志文件,这样崩溃后能精准定位问题:
      import logging
      import sys
      
      logging.basicConfig(
          filename='ScreenGrab_Run_Log.log',
          level=logging.INFO,
          format='%(asctime)s - %(levelname)s - %(message)s'
      )
      
      # 关键步骤添加日志
      logging.info("程序启动,开始执行截图操作")
      try:
          # 你的截图代码
          logging.info("截图完成,准备上传到ShareFile")
          # 你的上传代码
          logging.info("上传完成,程序正常退出")
      except Exception as e:
          logging.error(f"程序运行出错: {str(e)}", exc_info=True)
          sys.exit(1)
      

5. PyInstaller--noconsole模式的调试障碍

--noconsole会隐藏控制台,导致程序的错误输出无法直接看到,只能得到模糊的“Failed to Execute Script”提示。这会让你很难定位具体是哪一行代码出了问题。

  • 临时调试方案:
    • 先去掉--noconsole参数,重新打包成带控制台的exe,让任务计划运行这个版本,等崩溃时查看控制台输出的具体错误信息,这是最快定位问题的方法
    • 或者在脚本开头把标准错误重定向到日志文件:
      import sys
      sys.stderr = open('ScreenGrab_Error_Log.log', 'a')
      

总结建议

优先给脚本加上日志和异常捕获,然后临时换成带控制台的exe运行一段时间,拿到具体的错误信息后,再针对性解决资源泄漏、连接问题或者截图异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:47:46