PyInstaller打包生成的EXE运行时报错:ModuleNotFoundError: No module named wandb_gql
看起来你第一次用PyInstaller打包Streamlit+ETNA的项目就踩了依赖打包的坑,别慌,咱们一步步来解决这个wandb_gql缺失的问题。
首先,虽然你已经在spec文件里把wandb和wandb_gql加到了hiddenimports里,但PyInstaller对一些动态导入的依赖(比如wandb这类工具包)经常会有漏打包的情况,尤其是它的子模块。下面给你几个实用的解决方案:
方案一:补全hiddenimports的子模块
只加顶层模块可能不够,把wandb_gql的核心子模块也补充到spec的hiddenimports里,修改后的代码如下:
hiddenimports=['wandb', 'wandb_gql', 'wandb_gql.client', 'wandb_gql.transport.requests', 'wandb_gql.transport.websockets', 'wandb_gql.subscription'],
修改完spec文件后,重新执行打包命令:
pyinstaller main.spec
方案二:强制收集整个wandb依赖包
如果不想手动加子模块,可以直接用PyInstaller的--collect-all参数,强制它收集wandb和wandb_gql的所有关联文件(包括动态导入的模块和配置文件),命令如下:
pyinstaller --collect-all wandb --collect-all wandb_gql main.py
这个方法对新手特别友好,不用纠结到底漏了哪个子模块,直接全量打包。
方案三:手动添加wandb_gql的文件路径到datas
如果上面的方法还是不行,可以手动指定wandb_gql的安装目录,让PyInstaller把整个目录打包进去。
- 先找到你Python环境里
wandb_gql的安装路径,执行命令:
pip show wandb_gql
输出里的Location字段就是它的安装根目录,比如C:\Users\XXX\AppData\Local\Programs\Python\Python39\Lib\site-packages
2. 然后修改spec文件的datas字段,把wandb_gql目录加进去:
datas=[(r'C:\Users\XXX\AppData\Local\Programs\Python\Python39\Lib\site-packages\wandb_gql', 'wandb_gql')],
替换成你自己的路径后,重新打包即可。
额外调试技巧
如果还是有问题,可以打开调试模式看详细的导入日志:
pyinstaller --debug=imports main.py
运行生成的exe时,控制台会输出所有尝试导入的模块,你能清楚看到到底哪个模块没被正确打包,针对性补充到hiddenimports里就行。
另外要注意:如果你用了虚拟环境,打包时一定要激活对应的虚拟环境,并且确保PyInstaller是安装在这个虚拟环境里的,不然可能会引用系统Python的依赖,导致打包不全。
备注:内容来源于stack exchange,提问作者user21582026




