我用 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,而是我的本地安装...
有什么我忽略的建议吗?
尝试将
"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 及其中的链接。
我找到了解决方案...
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