You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:37:19