问题描述
我在 __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)]
)