我一辈子都无法让 python 的相对导入工作。我创建了一个它不起作用的简单示例:
目录结构为:
__init__.py
start.py
parent.py
sub/
__init__.py
relative.py
/start.py
只包含:import sub.relative
/sub/relative.py
仅包含 from .. import parent
所有其他文件都是空白的。
在命令行执行以下操作时:
$ cd /
$ python start.py
我明白了:
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”导入。 start.py
本身并不在包中,即使存在 __init__.py
。
您需要从 parent.py
上的一个目录启动您的程序:
./start.py
./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py
用start.py
:
import pkg.sub.relative
现在 pkg 是顶级包,您的相对导入应该可以工作。
如果您想坚持当前的布局,您可以使用 import parent
。因为您使用 start.py
来启动解释器,所以 start.py
所在的目录在您的 python 路径中。 parent.py
作为一个单独的模块存在。
如果您不将任何内容导入到目录树更上方的脚本中,您也可以安全地删除顶级 __init__.py
。
https://stackoverflow.com/questions/1918539/