【问题标题】:cx_freeze and importing modulescx_freeze 和导入模块
【发布时间】:2014-11-14 07:18:13
【问题描述】:

我想使用 cx_freeze 编译带有子模块的 Python 3.3 模块。

所以,我的目录结构是:

projectname/
     __init__.py
     submodule1/
          __init__.py
          bootstrap.py
          script1.py
          submodule11/
                   script2.py
     submodule2/
          ...

__init__.py我导入

from submodule1 import bootstrap

并从引导程序

import submodule1.submodule11.script2

如果我运行初始化文件,一切都很好,带有子模块导入的脚本会正确执行。

当我编译它时,我使用这个 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”目录中运行脚本。

但如果我启动应用程序,我会从错误对话框中得到ImportError: no module named 'submodule1.submodule11'

这是真的:在 library.zip 中这个子模块不存在。

我做错了什么?

【问题讨论】:

  • 你能显示冻结它的输出吗?会很长,放在pastebin里吧。

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


【解决方案1】:

这里是有相同问题的任何人的详细信息。

这是我的目录结构:

.
├─ 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文件。

__init__.py 在 dir1:

from dir1 import file1

__init__.py 在 dir2:

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 布局,所以我在 build/exe.macosx-10.15-x86_64-3.8 中手动创建 dir1dir2 并将 file1.kvfile2.kv 移动到每个文件夹.

【讨论】:

    【解决方案2】:

    所以,我找到了答案:每个模块的文件夹中都必须有一个 __init__.py 文件,这样 python 就会知道它是一个包,而不仅仅是某个文件夹。现在我编译我的项目。

    【讨论】:

    • 你能多解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2015-05-08
    • 2021-08-21
    相关资源
    最近更新 更多