我想使用cx_freeze编译带有子模块的Python 3.3模块。
所以,我的目标结构是:
projectname/
__init__.py
submodule1/
__init__.py
bootstrap.py
script1.py
submodule11/
script2.py
submodule2/
...
在__init__.py
I import
from submodule1 import bootstrap
并从bootstrap
import submodule1.submodule11.script2
如果我运行init文件,一切都很好,带有子模块导入的脚本会正确执行。
当我编译它时,我使用这个setup.py:
from cx_Freeze import setup,Executable
import sys
includes = []
excludes = ['Tkinter']
packages = ['submodule1', 'submodule2']
base = "Win32GUI"
setup(
name = 'myapp',version = '0.1',description = 'app',author = 'user',
options = {'build_exe': {'excludes':excludes,'packages':packages}},
executables = [Executable('__init__.py',base=base)]
)
并在' projectname'中运行脚本DIR。
但如果我启动应用程序,我会从错误对话框中获取ImportError: no module named 'submodule1.submodule11'
。
这是真的:在library.zip中,这个子模块确实存在。
我做错了什么?
答案 0 :(得分:3)
所以,我找到了答案:每个模块必须在其文件夹中有一个__init__.py
文件,因此python会知道它是一个包,而不仅仅是一些文件夹。现在我编译我的项目。
答案 1 :(得分:0)
以下是遇到同样问题的任何人的详细信息。
这是我的目录结构:
.
├─ dir1
│ ├─ __init__.py
│ ├─ __pycache__
│ ├─ file1.kv
│ └─ file1.py
├─ dir2
│ ├─ __init__.py
│ ├─ __pycache__
│ ├─ file2.kv
│ └─ file2.py
├─ favicon.ico
├─ main.kv
├─ main.py
├─ setup.py
├─ venv
└─ y
在每个目录模块中,我添加__init__.py
由于该模块位于dir1
和dir2
中,所以这是我的__init__.py
文件。
__init__.py
:
from dir1 import file1
dir2中的 __init__.py
:
from dir2 import file2
这是我的setup.py
文件:
from cx_Freeze import setup, Executable
import sys
# Dependencies are automatically detected, but it might need
# fine tuning.
buildOptions = dict(packages = ["kivy", "datetime", "time", "re", "dir1.file1","dir2.file2"],
excludes = [], include_files = ["main.kv", "dir1/file1.kv", "dir2/file2.kv"])
base = 'Win32GUI' if sys.platform=='win32' else None
executables = [
Executable('main.py', base=base, targetName='testApp', icon='favicon.ico')
]
setup(name='Test Apps',
version = '1.0',
description = 'This is the Testing Python Apps with Kivy',
options = dict(build_exe = buildOptions),
executables = executables)
这是使用Kivy测试的GUI python应用程序,这就是为什么我在软件包中包含“ kivy”的原因。
编译完成后,您将拥有Build
文件夹和可执行文件的子文件夹。我的笔记本电脑上有build/exe.macosx-10.15-x86_64-3.8
cz_freeze仅编译python文件,同时我需要file1.kv
和file2.kv
进行GUI布局,因此我在dir1
中手动创建了dir2
和build/exe.macosx-10.15-x86_64-3.8
并移动了file1.kv
和file2.kv
到每个文件夹。