cx_Freeze 不会编译用 importlib.util 导入的脚本
cx_Freeze won't compile scripts imported with importlib.util
我在 __init__.py
中有一些代码循环遍历目录并导入该目录中的所有 python 文件。
我的文件结构如下所示:
.
├── MyModule
│ ├── ModuleScripts
│ │ ├── __init__.py
│ │ ├── NotImportantModuleScript.py
│ │ ├── Lots.py
│ │ ├── Of.py
│ │ ├── Other.py
│ │ └── Scripts.py
│ └── __init__.py # This is the script that imports all of the modules in ModuleScripts.
├── setup.py # Actually called Compile.py
└── MyProgam.py
Main.py
需要能够访问由 __init__.py
添加的 MyModule.Lots
并且工作正常,直到我用 cx_Freeze
编译它
我从中导入所有文件的目录与 __init__.py
在同一目录中,并且有自己的 __init__.py
。我制作了脚本的这一部分,因为我懒得手动导入所有这些,因为所有这些都是必需的,而且我不断地添加到这个目录中。
代码看起来像这样:
root = str(os.path.abspath(os.path.join(os.path.dirname(__file__), "./ModuleScripts")))
for file in os.listdir(root):
if file.endswith('.py') and not str(file) in ["__init__.py", "NotImportantModuleScript.py"]:
filePath = str(os.path.abspath(os.path.join(root, file)))
baseName = str(os.path.basename(file)).rsplit('.', 1)[0]
spec = importlib.util.spec_from_file_location(baseName, filePath)
source = importlib.util.module_from_spec(spec)
spec.loader.exec_module(source)
现在,当我在另一个脚本中导入我的模块时,这工作得很好,但是当我尝试使用 cx_Freeze 编译它时,none 这些文件被编译。
这是 cx_Freeze 的 setup.py
:
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"]}
base = None
if sys.platform == "win32":
base = "Win32Gui"
setup(
name="My Programs Name",
version="1.0.0",
description="My Programs Description",
options={"build_exe": build_exe_options},
executables=[Executable("MyProgram.py", base=base)]
)
我的 setup.py
实际上被称为 Compile.py
因为我已经在目录中有一个 setup.py
但我不确定这是否会影响它。
像 MyProgram.py
这样的名称是占位符,而不是我的文件的实际名称。
注意:我对 cx_Freeze 几乎是全新的,所以这段代码几乎是从教程中删除的。我无法在网上找到有关此问题的任何信息,所以我使用了最后的手段。
我发现我只需要将我的模块文件夹的路径添加到 build_exe_options["include_files"]
看起来像这样:
build_exe_options = {
"packages": ["os"],
"include_files": ["/MyModule"]
}
我还删除了这两行:
if sys.platform == "win32":
base = "Win32Gui"
我的 setup.py
文件现在看起来像这样:
import os, sys
from cx_Freeze import setup, Executable
build_exe_options = {
"packages": ["os", "MyModule"],
"include_files": ["./MyModule"]
}
base = None
setup(
name="My Programs Name",
version="1.0.0",
description="My Programs Description",
options={"build_exe": build_exe_options},
executables=[Executable("MyProgram.py", base=base)]
)
我在 __init__.py
中有一些代码循环遍历目录并导入该目录中的所有 python 文件。
我的文件结构如下所示:
.
├── MyModule
│ ├── ModuleScripts
│ │ ├── __init__.py
│ │ ├── NotImportantModuleScript.py
│ │ ├── Lots.py
│ │ ├── Of.py
│ │ ├── Other.py
│ │ └── Scripts.py
│ └── __init__.py # This is the script that imports all of the modules in ModuleScripts.
├── setup.py # Actually called Compile.py
└── MyProgam.py
Main.py
需要能够访问由 __init__.py
添加的 MyModule.Lots
并且工作正常,直到我用 cx_Freeze
我从中导入所有文件的目录与 __init__.py
在同一目录中,并且有自己的 __init__.py
。我制作了脚本的这一部分,因为我懒得手动导入所有这些,因为所有这些都是必需的,而且我不断地添加到这个目录中。
代码看起来像这样:
root = str(os.path.abspath(os.path.join(os.path.dirname(__file__), "./ModuleScripts")))
for file in os.listdir(root):
if file.endswith('.py') and not str(file) in ["__init__.py", "NotImportantModuleScript.py"]:
filePath = str(os.path.abspath(os.path.join(root, file)))
baseName = str(os.path.basename(file)).rsplit('.', 1)[0]
spec = importlib.util.spec_from_file_location(baseName, filePath)
source = importlib.util.module_from_spec(spec)
spec.loader.exec_module(source)
现在,当我在另一个脚本中导入我的模块时,这工作得很好,但是当我尝试使用 cx_Freeze 编译它时,none 这些文件被编译。
这是 cx_Freeze 的 setup.py
:
import sys
from cx_Freeze import setup, Executable
build_exe_options = {"packages": ["os"]}
base = None
if sys.platform == "win32":
base = "Win32Gui"
setup(
name="My Programs Name",
version="1.0.0",
description="My Programs Description",
options={"build_exe": build_exe_options},
executables=[Executable("MyProgram.py", base=base)]
)
我的 setup.py
实际上被称为 Compile.py
因为我已经在目录中有一个 setup.py
但我不确定这是否会影响它。
像 MyProgram.py
这样的名称是占位符,而不是我的文件的实际名称。
注意:我对 cx_Freeze 几乎是全新的,所以这段代码几乎是从教程中删除的。我无法在网上找到有关此问题的任何信息,所以我使用了最后的手段。
我发现我只需要将我的模块文件夹的路径添加到 build_exe_options["include_files"]
看起来像这样:
build_exe_options = {
"packages": ["os"],
"include_files": ["/MyModule"]
}
我还删除了这两行:
if sys.platform == "win32":
base = "Win32Gui"
我的 setup.py
文件现在看起来像这样:
import os, sys
from cx_Freeze import setup, Executable
build_exe_options = {
"packages": ["os", "MyModule"],
"include_files": ["./MyModule"]
}
base = None
setup(
name="My Programs Name",
version="1.0.0",
description="My Programs Description",
options={"build_exe": build_exe_options},
executables=[Executable("MyProgram.py", base=base)]
)