这里似乎已经有很多关于 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 path
在 math
中的文件中。这会很糟糕,因为您希望包是不同的。如果他们需要使用另一个包中的某些东西,那么他们应该使用 from os import path
全局引用它们,并让 python 使用 $PATH
和 >$PYTHONPATH
.
当您使用 python -m package.test_A.test
时,然后使用 from ..A import foo
解决得很好,因为它会跟踪 中的内容包
,而您只是访问已加载位置的子目录。
为什么 python 不将当前工作目录视为一个包? 没有线索,但天哪,它会很有用。
https://stackoverflow.com/questions/30669474/