cx_freeze和导入模块

时间:2014-09-19 16:15:42

标签: python compilation executable cx-freeze python-module

我想使用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中,这个子模块确实存在。

我做错了什么?

2 个答案:

答案 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

由于该模块位于dir1dir2中,所以这是我的__init__.py文件。

dir1中的

__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.kvfile2.kv进行GUI布局,因此我在dir1中手动创建了dir2build/exe.macosx-10.15-x86_64-3.8并移动了file1.kvfile2.kv到每个文件夹。