python - 如何设置 Python 包

标签 python module package

我想要这个结构:

Zimp/controller/game_play -->如何:以最简单的方式导入 Zimp/model/game_play 模块? Zimp/model/game_play

我创建了一个名为controller的文件夹和一个名为model的文件夹。在这些文件夹中,我放置了一个空的 __init__.py 文件(不知道为什么它会执行任何操作)。我没有制作 model.py 文件或controller.py 文件。它不起作用。我刚刚制作了一个 model.py 和一个controller.py,除了创建新模块时自动出现的主 block 之外,它们都是空的。没有不同。

在controller/game_play.py中我尝试过:from ..model import game_play_model

它说值错误:尝试在非包中进行相对导入

这个想法是不是实际上将它们放在单独的目录中?标准是什么?

谢谢

最佳答案

问题是您正在尝试直接执行子包模块,请参阅问题 Attempted relative import in non-package even with __init__.py 的答案.

首先,我认为您需要像这样设置目录文件结构:

Zimp/                       top-level package
    __init__.py                 package initalization
    controller/                     subpackage
        __init__.py                     subpackage initalization
        game_play.py                    subpackage module
    model/                          subpackage
        __init__.py                     subpackage initalization
        game_play_model.py              subpackage module

__init__.py 文件可以全部为空,因为它们只是表明该目录是一个[sub]包。
为了便于说明,我们假设 game_play_model.py 文件包含:

print 'hello from game_play_model.py'

并且 game_play.py 文件包含以下内容以检测何时直接执行它,并将其文件夹的父级名称 - Zimp 添加到 Python搜索路径 - 这样您就可以在包以这种方式运行时直接导入其他内容。

if __name__ == '__main__' and __package__ is None:
    import sys, os.path as path
    # append parent of the directory the current file is in
    sys.path.append(path.dirname(path.dirname(__file__)))

import model.game_play_model

print 'hello from game_play.py'

你直接用python game_play.py之类的东西执行它,它会输出:

hello from game_play_model.py
hello from game_play.py

关于python - 如何设置 Python 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22185970/

相关文章:

algorithm - 打印安装包所需的最小包集

python - 如何使用keras进行多标签多类分类

python - python 上的重复项列表

python - CPLEX 和 Python 3.7

java - 在 Wildfly 模块中找不到持久单元

安卓包安全

python - 与引用列表比较以转换为二进制编码

java - 自定义 Android 模块中的重复条目 : org/appcelerator/titanium/gen/bindings. json

python-3.x - 无法获取缺少的 termios 模块。我如何正确获得它?

c++ - 用于集成 C++ 代码的包开发的 IDE/设置