似乎这里已经有很多关于 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
。导致此错误消息的具体原因是什么?
编辑:在其他问题中对此问题有更好/更连贯的答案:
- 兄弟包导入 https://stackoverflow.com/questions/6323860/sibling-package-imports
- 十亿次相对进口 https://stackoverflow.com/questions/14132789/relative-imports-for-the-billionth-time/14132912#14132912
为什么不起作用?这是因为 python 不记录包是从哪里加载的。所以当你这样做时python -m test_A.test
,它基本上只是丢弃了以下知识test_A.test
实际上存储在package
(i.e. package
不被视为一个包)。尝试from ..A import foo
正在尝试访问它不再有的信息(即加载位置的同级目录)。它在概念上类似于允许from ..os import path
在一个文件中math
。这会很糟糕,因为您希望包是不同的。如果他们需要使用另一个包中的某些东西,那么他们应该在全局范围内引用它们from os import path
让 python 找出它在哪里$PATH
and $PYTHONPATH
.
当你使用python -m package.test_A.test
,然后使用from ..A import foo
解决得很好,因为它跟踪了里面的内容package
并且您只是访问已加载位置的子目录。
为什么 python 不认为当前工作目录是一个包? NO CLUE,但是天哪,这会有用的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)