小编典典

谁能解释python的相对进口?

all

我一辈子都无法让 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。为什么会这样?如何使这个沙盒示例工作?


阅读 64

收藏
2022-08-08

共1个答案

小编典典

您正在从包“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如果您不将任何内容导入到目录树更上方的脚本中,您也可以安全地删除顶层。

2022-08-08