如何设置Python包
我想要这样的结构:
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