我有一个名为p
的包,它包含模块a
和b
。 a
依赖于b
:
b.py
的内容:
import a
然而我希望 确保 b
从同一 p
包目录下导入我的 a
模块,而不仅仅是从 PYTHONPATH
中导入任何一个 a
模块。
因此,我尝试将 b.py
更改如下:
from . import a
只要我在p
包目录之外导入b
,这就有效。 给定以下文件:
/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
为什么?
P.S. 我正在使用 Python 2.7.3。
from p import a
(如果存在p/p.py
文件,则在其前面添加from __future__ import absolute_import
))或显式相对导入(from . import a
(如果不是__main__
模块))。不要从Python包目录内运行脚本;这会将该目录前缀添加到sys.path中,可能导致同一模块的不同名称可用,从而导致与模块级状态相关的错误(如果使用隐式相对导入,则还会遮盖其他顶级模块)。 - jfs