31

我有p包含模块ab. a依赖于b

b.py内容:

import a

但是我想确保从同一个包目录导入我的模块,b而不仅仅是从.apaPYTHONPATH

所以我试图改变b.py如下:

from . import a

只要我在包目录b之外时导入,它就可以工作。p给定以下文件:

/tmp
    /p
       a.py
       b.py
       __init__.py

以下作品:

$ cd /tmp
$ echo 'import p.b' | python

以下不起作用:

$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "b.py", line 1, in <module>
    from . import a
ValueError: Attempted relative import in non-package

为什么?

PS我正在使用Python 2.7.3

4

3 回答 3

15

重读 Python导入文档后,我原来的问题的正确答案是:

为了确保从自己的包中b导入,只需在以下内容中编写以下内容:ab

import a

这是来自文档的引用:

子模块通常需要相互引用。例如,环绕模块可能使用回声模块。事实上,这种引用非常普遍,以至于 import 语句首先在包含包中查找,然后再查找标准模块搜索路径。

注意:正如 JF Sebastian 在下面的评论中建议的那样,不建议使用隐式导入,事实上,它们在 Python 3 中已经消失了。

于 2013-01-08T14:19:23.787 回答
5

因为里面有一个__init__.py文件/p。该文件告诉 Python:“此文件夹中的所有模块都在包中p”。

只要文件存在,无论您身在何处,都__init__.py可以导入bas 。p.b

所以正确的导入b.py是:import p.a

于 2013-01-08T13:42:54.373 回答
0

相对导入仅适用于包内。

如果b从您所在的位置导入,则没有包的概念,因此无法进行相对导入。

如果你导入p.b,它是bpackage中的模块c

重要的不是目录结构,而是包结构。

于 2013-01-08T13:45:13.057 回答