用cx_Freeze包装后无法加载 kera



我已经用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:PyPrjFP2venvlibsite-packagestensorflowpythonutillazy_loader.py", line 58, in __getattr__
module = self._load()
File "D:PyPrjPF2venvlibsite-packagestensorflowpythonutillazy_loader.py", line 41, in _load
module = importlib.import_module(self.__name__)
File "C:UsersPGDAppDataLocalProgramsPythonPython39libimportlib__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:PyPrjFP2venv))和从我的本地Python安装(C:UsersPGDAppData local…) ? !

这是我的设置。:

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,而是运行我的本地安装…

有什么建议我忽略了吗?

我找到了一个解决方案…

首先我编辑了脚本并使用:

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"],
我在0.2版本中安装了lazy_loader皮普:
py.exe -m pip install lazy_loader

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

关于你的评论:

这听起来不对- cx_Freeze应该打包程序的独立版本。那么为什么它尝试从我为项目创建的venv (D:PyPrjFP2venv)和我的本地Python安装(C:UsersPGDAppData local…)运行文件?!

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

条目,让cx_Freeze用相对路径替换这些绝对路径。
'replace_paths': [("*", "")]

build_exe_options。参见问题#247中的cx_Freeze存储库及其链接。

最新更新