在嵌套包中导入模块

时间:2010-02-02 10:11:31

标签: python import package

这是一个python新手问题:

我有以下目录结构:

test
 -- test_file.py
a
 -- b
   -- module.py    

其中testab是文件夹。 testa都处于同一级别。

module.py有一个名为shape的类,我想在test_file.py中实例化它的一个实例。我怎么能这样做?

我试过了:

from a.b import module

但我得到了:

ImportError: No module named a.b

3 个答案:

答案 0 :(得分:18)

你想要的是一个相对导入,如:

from ..a.b import module

这样做的问题是,如果您将test_file.py作为主模块,则它不起作用。如上所述here

  

请注意,显式和隐式相对导入都基于当前模块的名称。由于主模块的名称始终为“ main ”,因此用作Python应用程序主模块的模块应始终使用绝对导入。

因此,如果您想将test_file.py作为主要模块,那么您应该考虑更改模块的结构并使用绝对导入,否则只需使用上面的相对导入。

答案 1 :(得分:13)

  1. 目录a需要是一个包。添加一个__init__.py文件使其成为一个包,这是一个简单的目录。

  2. 目录b也需要是a的子包。添加__init__.py文件。

  3. 目录test也可能是一个包。很难说这是否有必要。对于每个Python模块目录来说,通常一个好主意是正式的包。

  4. import,套餐必须在sys.path;这是从PYTHONPATH环境变量构建的。默认情况下,已安装的站点包和当前工作目录(有效地)是唯一可以找到包的两个位置。

    这意味着必须安装a,或者,您当前的工作目录也必须是高于a一级的包。

    或者,您需要将PYTHONPATH环境变量设置为包含a

  5. http://docs.python.org/tutorial/modules.html#the-module-search-path

    http://docs.python.org/using/cmdline.html#envvar-PYTHONPATH

    另外,http://docs.python.org/library/site.html有关sys.path如何构建的完整信息。

答案 2 :(得分:10)

要做的第一件事就是快速浏览the official docs on this

要将目录设为包,您必须添加__init__.py文件。这意味着您将在ab目录中拥有此类文件。然后你可以直接做一个

import a.b.module

但是您必须将其称为a.b.module,这是单调乏味的,因此您可以使用导入的as形式

import a.b.module as mod #shorter name

并将其称为mod

然后,您可以使用常规约定mod来实例化mod.shape()内的内容。

还有其他一些细微之处。请仔细阅读文档了解详情。