如何设置Python包

时间:2014-03-05 00:15:31

标签: python module package

我想要这个结构:

Zimp / controller / game_play - >我如何:以最简单的方式导入Zimp / model / game_play模块? Zimp /模型/ 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 :(得分:1)

问题是您正在尝试直接执行子包模块,请参阅问题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

答案 1 :(得分:0)

from Zimp.model import game_play

应该做的伎俩。