我一辈子都无法让 python 的相对导入工作。我创建了一个它不起作用的简单示例:
目录结构为:
__init__.py start.py parent.py sub/ __init__.py relative.py
/start.py仅包含:import sub.relative
/start.py
import sub.relative
/sub/relative.py只包含from .. import parent
/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礼物,它本身也不在包装中。
start.py
__init__.py
您需要从一个目录启动您的程序parent.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作为一个单独的模块住在那里。
import parent
__init__.py如果您不将任何内容导入到目录树更上方的脚本中,您也可以安全地删除顶层。