You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyInstaller打包生成的EXE运行时报错:ModuleNotFoundError: No module named wandb_gql

PyInstaller打包生成的EXE运行时报错:ModuleNotFoundError: No module named wandb_gql

看起来你第一次用PyInstaller打包Streamlit+ETNA的项目就踩了依赖打包的坑,别慌,咱们一步步来解决这个wandb_gql缺失的问题。

首先,虽然你已经在spec文件里把wandbwandb_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参数,强制它收集wandbwandb_gql的所有关联文件(包括动态导入的模块和配置文件),命令如下:

pyinstaller --collect-all wandb --collect-all wandb_gql main.py

这个方法对新手特别友好,不用纠结到底漏了哪个子模块,直接全量打包。

方案三:手动添加wandb_gql的文件路径到datas

如果上面的方法还是不行,可以手动指定wandb_gql的安装目录,让PyInstaller把整个目录打包进去。

  1. 先找到你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

火山引擎 最新活动