PyInstaller打包PySimpleGUI应用时缺失keras模块,如何包含所有隐藏导入?
PyInstaller打包含Keras模型的PySimpleGUI应用时ModuleNotFoundError的解决办法
我开发了一个基于PySimpleGUI的应用,该应用通过Joblib读取.pkl.pkl格式的CNN模型。使用以下PyInstaller命令将主文件main.py转换为.exe:
pyinstaller --noconfirm --onedir --windowed --icon "icon.ico" --add-data "icon.ico;." --add-data "finalmodel.pkl.pkl;." main.py
打包过程顺利完成,但运行生成的.exe文件时出现如下报错:
Traceback (most recent call last): File "main.py", line 10, in <module> File "joblib\numpy_pickle.py", line 658, in load File "joblib\numpy_pickle.py", line 577, in _unpickle File "pickle.py", line 1213, in load File "pickle.py", line 1538, in load_stack_global File "pickle.py", line 1580, in find_class ModuleNotFoundError: No module named 'keras'
问题:是否有办法让PyInstaller自动包含所有隐藏导入的模块?
PyInstaller无法完全自动捕获所有隐藏导入,因为通过pickle/joblib加载的模型依赖(比如Keras)属于运行时动态导入,不会被PyInstaller的静态分析检测到。不过可以通过以下几种方式解决这类问题:
- 显式导入依赖模块
在main.py开头添加显式的导入语句,让PyInstaller能识别到这些依赖:
import keras # 若模型用到Keras的子模块,也一并导入 from keras.models import load_model
- 用
--hidden-import参数手动指定
无需修改代码,直接在打包命令中追加--hidden-import参数来指定缺失的模块:
pyinstaller --noconfirm --onedir --windowed --icon "icon.ico" --add-data "icon.ico;." --add-data "finalmodel.pkl.pkl;." --hidden-import keras --hidden-import keras.models main.py
后续如果出现其他模块缺失,继续追加--hidden-import 模块名即可。
- 通过.spec文件配置
先生成.spec文件:
pyinstaller --specpath . main.py
打开生成的main.spec文件,找到hiddenimports字段,补充需要的模块:
hiddenimports=['keras', 'keras.models'],
最后用.spec文件执行打包:
pyinstaller main.spec
内容的提问来源于stack exchange,提问作者AJ gameboy
相关产品推荐
相关产品推荐

