用cx_Freeze打包后无法加载keras

问题描述 投票:0回答:2

我用 cx_Freeze 打包了一个应用程序,但是当我启动该应用程序时,出现以下错误:

ERROR:root:UNEXPECTED ERROR:
Traceback (most recent call last):
  File "ai_hound.py", line 78, in run
  File "ai_hound.py", line 51, in load_models
  File "D:\PyPrj\FP2\venv\lib\site-packages\tensorflow\python\util\lazy_loader.py", line 58, in __getattr__
    module = self._load()
  File "D:\PyPrj\PF2\venv\lib\site-packages\tensorflow\python\util\lazy_loader.py", line 41, in _load
    module = importlib.import_module(self.__name__)
  File "C:\Users\PGD\AppData\Local\Programs\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'keras'

这对我来说听起来不对 - cx_Freeze 应该打包一个独立版本的程序。那么为什么它尝试从我为项目创建的 venv (D:\PyPrj\FP2 env) 和我本地的 Python 安装 (C:\Users\PGD\AppData\Local...) 运行文件?!

这是我的setup.py

import sys, os
from cx_Freeze import setup, Executable

PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARA'] =     os.path.join(PYTHON_INSTALL_DIR, "tcl", "tcl8.6")
os.environ['TK_LIBRARA'] =     os.path.join(PYTHON_INSTALL_DIR, "tcl", "tk8.6")

build_exe_options = {"packages": ["time", "sys", "os", "base64", "cv2", "logging", "codecs", "shutil", "zipfile", "fitz", "pandas", "numpy", "tensorflow", "PIL", "io", "tkinter"],
                     "includes": ["tkinter", "tensorflow"],
                     "include_files": [ os.path.join(PYTHON_INSTALL_DIR, "DLLs", "tk86t.dll"), os.path.join(PYTHON_INSTALL_DIR, "DLLs", "tcl86t.dll") ],
                     "excludes": []}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name = "AI Hound",
    version = "1.0.1",
    description = "AI Hound",
    options = {"build_exe": build_exe_options},
    executables = [Executable("ai_hound.py", icon="icon.ico", base = base)]
)

在构建文件夹中,我有 2GB 的文件,并且有一个带有子文件夹 python/keras 的 tensorflow 文件夹!所以我猜 EXE 文件不运行打包的 Python,而是我的本地安装...

有什么我忽略的建议吗?

python python-3.x tensorflow keras cx-freeze
2个回答
0
投票

尝试将

"keras"
添加到
"packages"
build_exe_options
列表中,并使用最新的cx_Freeze版本(您使用的是哪个?),它应该支持
tensorflow
.

关于您的评论:

这对我来说听起来不对 - cx_Freeze 应该打包一个独立版本的程序。那么为什么它会尝试从我为项目创建的 venv (D:\PyPrj\FP2 env) 和我的本地 Python 安装 (C:\Users\PGD\AppData\Local...) 运行文件?!

我相信 cx_Freeze 正在运行该程序的独立版本。显示的路径是附加到代码对象的文件名,这些文件名可能在移动冻结的应用程序时不会实现。您可以通过添加条目让 cx_Freeze 通过相对路径替换这些绝对路径

'replace_paths': [("*", "")]

build_exe_options
。请参阅 cx_Freeze 存储库上的issue #247 及其中的链接。


0
投票

我找到了解决方案...

1st 我编辑脚本并使用:

import keras

代替

from tensorflow import keras
.

第二次我将 keras 添加到包列表中:

"packages": ["time", "sys", "os", "base64", "cv2", "logging", "codecs", "shutil", "zipfile", "fitz", "pandas", "numpy", "tensorflow", "PIL", "io", "tkinter", "keras"],

第三次我用 pip 在版本

0.2
中安装了lazy_loader

py.exe -m pip install lazy_loader
© www.soinside.com 2019 - 2024. All rights reserved.