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)]
)