我的软件包p
包含模块a
和b
。 a
依赖于b
:
b.py
内容:
import a
但是,我希望确保 b
从同一个a
软件包目录导入我的p
模块,而不是从a
模块导入PYTHONPATH
模块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
以下内容不起作用:
{{1}}
为什么吗
P.S。我使用的是Python 2.7.3
答案 0 :(得分:8)
重读Python import documentation后,我原来问题的正确答案是:
要确保b
从其自己的软件包中导入a
,只需在b
中编写以下内容:
import a
以下是文档的引用:
子模块通常需要相互引用。例如, 环绕声模块可能使用echo模块。事实上,这样的引用 是如此常见,导入语句首先在包含中查找 在查看标准模块搜索路径之前打包。
注意:正如J.F. Sebastian在下面的评论中所建议的,不建议使用隐式导入,事实上它们已经在Python 3中使用了。
答案 1 :(得分:0)
因为__init__.py
中有/p
个文件。该文件告诉Python:“此文件夹中的所有模块都在包p
”中。
只要__init__.py
文件存在,您就可以b
导入p.b
,无论您身在何处。
因此,b.py
中的正确导入为:import p.a
答案 2 :(得分:0)
相对导入仅适用于包。
如果从您所在的位置导入b
,则没有包的概念,因此无法进行相对导入。
如果您导入p.b
,则b
包中的模块为c
。
重要的不是目录结构,而是包结构。