cx_Freeze 不会编译使用 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 需要能够访问由 MyModule.Lots 添加__init__.py 并且工作正常,直到我使用 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 编译它时,这些文件都没有被编译。

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