任何人都可以解释python的相对进口吗?

Can anyone explain python's relative imports?

我不能为我的生活得到python的相对导入工作。 我创建了一个它不起作用的简单示例:

目录结构是:

1
2
3
4
5
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py

/start.py仅包含:import sub.relative

/sub/relative.py仅包含from .. import parent

所有其他文件都是空白的。

在命令行上执行以下操作时:

1
2
$ cd /
$ python start.py

我明白了:

1
2
3
4
5
6
Traceback (most recent call last):
  File"start.py", line 1, in <module>
    import sub.relative
  File"/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
    from .. import parent
ValueError: Attempted relative import beyond toplevel package

我使用的是Python 2.6。 为什么会这样? 如何使这个沙盒示例工作?


您正在从包"sub"导入。即使存在__init__.pystart.py本身也不在包中。

您需要从parent.py上的一个目录启动程序:

1
2
3
4
5
6
./start.py

./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py

使用start.py

1
import pkg.sub.relative

现在pkg是顶级包,你的相对导入应该有效。

如果您想坚持使用当前布局,可以使用import parent。因为您使用start.py来启动解释器,所以start.py所在的目录位于您的python路径中。 parent.py作为一个单独的模块住在那里。

如果不将任何内容导入目录树中的脚本,也可以安全地删除顶级__init__.py


如果要直接调用relative.py,即如果您确实要从顶级模块导入,则必须将其显式添加到sys.path列表中。
这是它应该如何工作:

1
2
3
4
5
6
7
8
9
# Add this line to the beginning of relative.py file
import sys
sys.path.append('..')

# Now you can do imports from one directory top cause it is in the sys.path
import parent

# And even like this:
from parent import Parent

如果您认为上述情况可能导致某种不一致,您可以使用此代码:

1
sys.path.append(sys.path[0] +"/..")

sys.path[0]指的是从中运行入口点的路径。