使用PyInstaller/auto-py-to-exe打包Py脚本为exe时gevent钩子超时报错
问题背景
- 运行环境:Windows 10 系统,基于Anaconda搭建的Python 3.8.8环境
- 脚本情况:面向日常办公场景的自动化脚本,基于
pyautogui、tkinter开发,覆盖SQL/Excel/谷歌浏览器自动操作、跨软件数据复制粘贴、表单填写、OTP操作提示等工作流,仅做基础UI封装和操作函数定义,逻辑简单 - 打包尝试:先后使用
auto-py-to-exe、PyInstaller 4.9工具,执行pyinstaller -F Daily_Job_Automation.py命令尝试打包单文件exe,均执行失败 - 报错特征:打包流程加载到
hook-gevent.py模块钩子阶段触发异常,收集gevent包所有子模块的子进程运行满60秒后,抛出subprocess.TimeoutExpired超时错误,打包流程直接终止
可行解决方案
按操作成本从低到高排序,优先尝试靠前的方案:
方案1:打包时排除无关的gevent模块(优先尝试,1分钟就能验证)
你的脚本本身没有直接调用gevent,这个包是其他依赖引入的可选关联依赖,PyInstaller默认全量递归收集所有子模块才会触发超时,直接在打包命令里加排除参数即可,不会影响脚本核心功能:
pyinstaller -F Daily_Job_Automation.py --exclude-module gevent --exclude-module gevent._gevent_cgreenlet --exclude-module gevent.libev
如果使用auto-py-to-exe可视化工具打包,找到高级设置里的「排除模块」输入项,把上述三个模块名逐行添加后再启动打包即可。
方案2:拉长PyInstaller的子进程超时阈值
如果排除gevent后仍出现其他模块的收集超时问题,可以直接修改PyInstaller的默认超时配置:
- 定位到Anaconda环境下的PyInstaller安装路径,目标文件一般为
Anaconda安装目录\Lib\site-packages\PyInstaller\compat.py - 在文件中搜索
timeout=60字段,将数值修改为300(即超时时间设置为5分钟) - 保存文件后重新执行打包命令
注意:修改配置文件前建议先备份原文件,避免修改错误导致PyInstaller无法正常运行
这个报错的核心诱因之一是Anaconda默认环境预装了大量冗余包,全量递归收集子模块时受磁盘IO、进程调度影响响应变慢,拉长超时时间即可正常走完收集流程。
方案3:使用纯净虚拟环境打包(最稳妥,还能压缩exe体积)
Anaconda默认环境预装了上百个脚本根本用不到的第三方包,不仅容易触发各类打包钩子异常,打出来的exe体积也会虚高,用纯净环境打包可以从根源规避这类问题:
- 打开Anaconda Prompt,依次执行以下命令创建并激活纯净虚拟环境:
conda create -n auto_pack python=3.8.8 -y conda activate auto_pack
- 仅安装脚本运行和打包必须的依赖:
pip install pyautogui pyinstaller==4.9
提示:tkinter是Python标准库,不需要额外执行pip安装
3. 切换到脚本所在目录,重新执行打包命令即可,这个环境没有gevent等无关冗余包,不会触发钩子收集超时问题。
方案4:卸载当前环境的gevent包后打包
如果不想新建虚拟环境,可以直接在当前使用的Anaconda环境中执行pip uninstall gevent -y命令卸载gevent包,再重新运行打包命令即可。你的办公自动化脚本本身不依赖gevent,卸载不会影响脚本的正常功能。
内容的提问来源于stack exchange,提问作者Samson chua
相关产品推荐
相关产品推荐

