gpt4 book ai didi

python - 超出相对导入中的顶级包错误

转载 作者:IT老高 更新时间:2023-10-28 12:15:59 25 4
gpt4 key购买 nike

这里似乎已经有很多关于 python 3 中的相对导入的问题,但是在经历了许多问题之后,我仍然没有找到我的问题的答案。所以这就是问题所在。

我有一个如下所示的包裹

package/
__init__.py
A/
__init__.py
foo.py
test_A/
__init__.py
test.py

我在 test.py 中有一行:

from ..A import foo

现在,我在package的文件夹中,我运行

python -m test_A.test

我收到消息

"ValueError: attempted relative import beyond top-level package"

但如果我在 package 的父文件夹中,例如,我运行:

cd ..
python -m package.test_A.test

一切都很好。

现在我的问题是:当我在 package 的文件夹中时,我将 test_A 子包中的模块作为 test_A.test 运行,根据我的理解,..A 只上升了一层,它仍然在 package 文件夹中,为什么它会给出消息说 beyond top-level package。导致此错误消息的具体原因是什么?

最佳答案

编辑:在其他问题中有更好/更连贯的答案:


为什么不起作用?这是因为 python 不记录从哪里加载包。所以当你执行 python -m test_A.test 时,它基本上只是丢弃了 test_A.test 实际上存储在 package 中的知识(即 package 不被视为包)。尝试 from ..A import foo 正在尝试访问它不再拥有的信息(即加载位置的同级目录)。它在概念上类似于允许 from ..os import pathmath 中的文件中。这会很糟糕,因为您希望包是不同的。如果他们需要使用另一个包中的某些东西,那么他们应该使用 from os import path 全局引用它们,并让 python 使用 $PATH >$PYTHONPATH.

当您使用 python -m package.test_A.test 时,然后使用 from ..A import foo 解决得很好,因为它会跟踪 中的内容包,而您只是访问已加载位置的子目录。

为什么 python 不将当前工作目录视为一个包? 没有线索,但天哪,它会很有用。

关于python - 超出相对导入中的顶级包错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com