PyQt5脚本打包exe报Unhandled exception in script错误解决
PyQt5程序打包为exe报模块找不到的解决方案
这个问题本质是两个原因:要么打包用的Python环境和安装PyQt5的环境不匹配,要么PyInstaller没有自动识别到PyQtWebEngine关联的所有隐式依赖,按以下步骤操作即可解决:
1. 先对齐打包环境
绝大多数人踩这个坑都是因为电脑上装了多个Python版本,或者PyCharm用了虚拟环境,pip装包的时候装到了别的环境里,打包时调用的PyInstaller找不到对应依赖。
- 打开你写代码用的PyCharm内置终端,不要用系统自带的cmd,依次执行以下命令校验当前环境的依赖:
- 检查PyQt5安装状态:
pip show PyQt5 - 检查PyQtWebEngine安装状态:
pip show PyQtWebEngine - 检查PyInstaller安装状态:
pip show pyinstaller
- 检查PyQt5安装状态:
- 如果上面任意一条命令执行后没有返回版本号、安装路径信息,说明当前环境没装对应包,先执行清理再重装:
pip uninstall -y PyQt5 PyQtWebEngine PyQt5-sip pyinstaller pip install PyQt5 PyQtWebEngine pyinstaller
2. 带全依赖参数执行打包
PyQtWebEngine关联了多个PyQt5子模块,PyInstaller默认的静态扫描识别不到这些依赖,手动挨个加缺失模块效率太低,直接在项目根目录的终端里执行以下打包命令即可:
Windows系统用这个命令:
pyinstaller -w -F ^ --hidden-import PyQt5.QtCore ^ --hidden-import PyQt5.QtGui ^ --hidden-import PyQt5.QtWidgets ^ --hidden-import PyQt5.QtWebEngineWidgets ^ --hidden-import PyQt5.QtWebEngineCore ^ --hidden-import PyQt5.QtWebChannel ^ --hidden-import PyQt5.sip ^ main.py
macOS/Linux系统把行尾的^换成\即可。
3. 仍报错时补充路径配置
如果执行完上面的命令还是报模块找不到,先执行pip show PyQt5拿到PyQt5的安装路径,比如返回的Location字段是C:\Users\Alessandro\AppData\Local\Programs\Python\Python310\lib\site-packages,就在打包命令里加--paths参数指向PyQt5的安装目录,示例命令:
pyinstaller -w -F ^ --paths "C:\Users\Alessandro\AppData\Local\Programs\Python\Python310\lib\site-packages\PyQt5" ^ --hidden-import PyQt5.QtCore ^ --hidden-import PyQt5.QtGui ^ --hidden-import PyQt5.QtWidgets ^ --hidden-import PyQt5.QtWebEngineWidgets ^ --hidden-import PyQt5.QtWebEngineCore ^ --hidden-import PyQt5.QtWebChannel ^ --hidden-import PyQt5.sip ^ main.py
注意事项
- 每次重新打包前,先把之前生成的
build、dist文件夹,以及后缀为.spec的打包配置文件全部删掉,避免旧缓存影响打包结果 - 不建议用
-F单文件模式打包带PyQtWebEngine的程序,单文件启动速度慢,还容易出现运行时路径解析错误,换成-D目录模式打包稳定性会高很多 - 如果用auto-py-to-exe工具,直接在工具的高级设置里,把上面列的所有隐式导入模块添加进去,再把PyQt5的安装路径加到附加路径栏里,和命令行打包效果一致
内容的提问来源于stack exchange,提问作者melone
相关产品推荐
相关产品推荐

