PyInstaller打包exe定时运行触发“Failed to Execute Script main”错误及Task Scheduler返回0x103代码问题求助
我完全理解你的困扰——明明程序能正常跑几百次,毫无征兆就突然崩溃弹出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() - 给上传逻辑加上完整的异常捕获,比如捕获网络超时、权限错误等,记录错误信息后优雅退出,而不是让异常直接崩溃程序
- 检查你的ShareFile操作代码,务必用
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

