python - 谁能解释python的相对进口?

我一辈子都无法让 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/

相关文章:

linux - Linux 的虚拟串行端口

python - 在 Python 中使用 "continue"语句的示例?

python - `sorted(list)` 与 `list.sort()` 有什么区别?

python - Django 数据库设置 'Improperly Configured' 错误

linux - 如何获取终端的字符编码

linux - bash中带有变量的别名

mysql - 重命名 MySQL 数据库

python - 如何模拟请求和响应?

python - 如何在 Python 中创建不可变对象(immutable对象)?

linux - 如何从容器本身获取 Docker Linux 容器信息?