cx_freeze: ModuleNotFoundError 和程序停止工作
cx_freeze: ModuleNotFoundError and program stopped working
我有一个控制台模式程序,我想与 cx_Freeze 一起分发。我刚刚在一台新装的win 10机器上下载了python 3.6.3(amd64和win32版本)。我已经从轮子(不是从 pypi)安装了 cx_Freeze 5.1。然后我构建了程序的 amd64 和 win32 版本。如果我尝试在我构建它的同一台机器上执行该 exe 文件,我会收到此错误:
Fatal Python error: Py_Initialize: unable to load the file system codec
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\encodings\__init__.py", line 31, in <module>
ModuleNotFoundError: No module named 'codecs'
我在两种架构上都有同样的错误。安装文件如下所示:
#!/usr/bin/env python3
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"packages": [
"os", "io", "copy", "struct", "hashlib", "random",
"urllib", "pycurl", "json", "multiprocessing",
"cryptography",
"tornado", "watchdog", "pathtools"
],
"includes": [
"cryptography", "urllib.parse",
],
"include_files": ["tmp", "server.ini", "client.ini"],
"excludes": ["tkinter"],
}
setup(
name="BlindBackup",
version="1.0",
description="BlindBackup",
options={"build_exe": build_exe_options},
executables=[
Executable("backup.py", base=None),
Executable("bsync.py", base=None),
Executable("server.py", base=None),
]
)
换句话说,我明确指定了 "codecs" 包。
怎么了?
UPDATE 在分发目录中有一个名为 library.zip 的文件。它包含 codecs.pyc 但 exe 文件看不到它。如果我从该 zip 中提取所有文件,则会收到不同的错误消息:
C:\Python\Projects\blindbackup\build\exe.win-amd64-3.6>backup.exe
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\Program Files\Python36\lib\site-packages\cx_Freeze\initscripts\Console.py", line 22, in run
importer = zipimport.zipimporter(os.path.dirname(os.__file__))
zipimport.ZipImportError: not a Zip file
我猜问题出在尝试从 library.zip 文件导入模块的代码上?但不确定如何修复它。
解决方案是这样的:
- 安装cx_freeze6,因为版本5不支持python3.6(貌似)
- 安装 pywin32(虽然我的程序不需要它)
- 将所有缺少的 pyd 文件添加到 "includes" 并将所有缺少的包添加到 "packages" 将其设置脚本部分。
我有一个控制台模式程序,我想与 cx_Freeze 一起分发。我刚刚在一台新装的win 10机器上下载了python 3.6.3(amd64和win32版本)。我已经从轮子(不是从 pypi)安装了 cx_Freeze 5.1。然后我构建了程序的 amd64 和 win32 版本。如果我尝试在我构建它的同一台机器上执行该 exe 文件,我会收到此错误:
Fatal Python error: Py_Initialize: unable to load the file system codec
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\encodings\__init__.py", line 31, in <module>
ModuleNotFoundError: No module named 'codecs'
我在两种架构上都有同样的错误。安装文件如下所示:
#!/usr/bin/env python3
from cx_Freeze import setup, Executable
# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {
"packages": [
"os", "io", "copy", "struct", "hashlib", "random",
"urllib", "pycurl", "json", "multiprocessing",
"cryptography",
"tornado", "watchdog", "pathtools"
],
"includes": [
"cryptography", "urllib.parse",
],
"include_files": ["tmp", "server.ini", "client.ini"],
"excludes": ["tkinter"],
}
setup(
name="BlindBackup",
version="1.0",
description="BlindBackup",
options={"build_exe": build_exe_options},
executables=[
Executable("backup.py", base=None),
Executable("bsync.py", base=None),
Executable("server.py", base=None),
]
)
换句话说,我明确指定了 "codecs" 包。
怎么了?
UPDATE 在分发目录中有一个名为 library.zip 的文件。它包含 codecs.pyc 但 exe 文件看不到它。如果我从该 zip 中提取所有文件,则会收到不同的错误消息:
C:\Python\Projects\blindbackup\build\exe.win-amd64-3.6>backup.exe
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
module.run()
File "C:\Program Files\Python36\lib\site-packages\cx_Freeze\initscripts\Console.py", line 22, in run
importer = zipimport.zipimporter(os.path.dirname(os.__file__))
zipimport.ZipImportError: not a Zip file
我猜问题出在尝试从 library.zip 文件导入模块的代码上?但不确定如何修复它。
解决方案是这样的:
- 安装cx_freeze6,因为版本5不支持python3.6(貌似)
- 安装 pywin32(虽然我的程序不需要它)
- 将所有缺少的 pyd 文件添加到 "includes" 并将所有缺少的包添加到 "packages" 将其设置脚本部分。