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

这里似乎已经有很多关于 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。导致此错误消息的具体原因是什么?

最佳答案

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

  • Sibling package imports
  • Relative imports for the billionth time

为什么不起作用?这是因为 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 不将当前工作目录视为一个包? 没有线索,但天哪,它会很有用。

https://stackoverflow.com/questions/30669474/

相关文章:

python - 如何在 Python 中生成动态(参数化)单元测试?

python - 在 Python 中使用多处理时我应该如何记录?

linux - 如何在 Linux 上通过 FTP 递归下载文件夹

linux - 在一行中执行组合多个 Linux 命令

linux - 如何限制递归文件列表的深度?

python - 如何在 Django 中按日期范围过滤查询对象?

python - 使用多处理 Pool.map() 时无法 pickle

linux - 如何在 Linux 上按名称而不是 PID 杀死进程?

linux - 如何从 Linux shell 运行具有与当前不同工作目录的程序?

c - 什么是 LD_PRELOAD 技巧?