如何设置Python包

1 投票
2 回答
675 浏览
提问于 2025-04-17 20:52

我想要这样的结构:

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

Zimp/model/game_play

我创建了一个叫做 controller 的文件夹和一个叫做 model 的文件夹。在这些文件夹里,我放了一个空的 __init__.py 文件(我也不知道这样做有什么用)。我没有创建 model.py 文件或 controller.py 文件。这样不行。我刚刚创建了一个空的 model.py 和 controller.py,里面只有创建新模块时自动出现的主块。结果没有变化。

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

结果提示值错误:在非包中尝试相对导入

难道说其实不应该把它们放在不同的目录里?这样做的常规做法是什么?

谢谢

2 个回答

0
from Zimp.model import game_play

这样做就可以了。

1

问题在于你试图直接执行一个子包模块,具体可以参考这个问题的回答:即使有 __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 文件可以是空的,因为它们只是用来表示这个文件夹是一个[子]包。
为了方便说明,假设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

撰写回答