2010-02-02 67 views
15

导入模块,这是一个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 
+0

请参阅http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python。 – 2010-02-02 10:30:33

回答

13

你想要的是像一个相对进口:

from ..a.b import module

这样做的问题是,如果你正在为你的主模块调用test_file.py这是行不通的。如前所述here

Note that both explicit and implicit relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application should always use absolute imports.

所以,如果你想打电话test_file.py作为主模块,那么你应该考虑改变你的模块的结构和使用绝对导入,否则只使用相对进口从上面。

+0

+1。我没有注意到他试图从哪里进口。 – 2010-02-02 10:40:50

+1

向(我不知道)down-voter:当你对一个答案投下赞成票时,你应该留下一个解释它的错误的评论,这样任何读它的人(和作者)都可以被告知错误... – 3lectrologos 2010-02-02 11:33:11

+0

我得到ValueError:试图在非包中尝试相对导入 – khelll 2010-02-02 12:06:47

7

做的第一件事将是快速浏览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.shape()mod内实例化事物。

还有一些其他的微妙之处。请详细阅读文档。

+0

我没有导入abmodule为mod并为所有软件包添加了__init__.py,但我得到了ImportError:没有名为abmodule的模块 – khelll 2010-02-02 12:03:47

+0

@khell你应该像python test/test_file.py那样从根目录运行命令 – systempuntoout 2010-06-20 19:32:57

+1

它是'__init__。 py'。不是'init.py'。详细信息请查看答案中的链接。 – 2010-06-21 07:58:17

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

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

  3. 目录test应该也可能是一个包。很难说如果这是必要的或不。 Python模块的每个目录都是一个正式的包通常是一个好主意。

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

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

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

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.htmlsys.path如何构建完整的信息。