我已经用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存储库及其链接。