相对导入中超出顶级包错误[重复]

2024-01-09

似乎这里已经有很多关于 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(使用前将#替换为@)

相对导入中超出顶级包错误[重复] 的相关文章

随机推荐