【问题标题】:Python3: Relative import beyond toplevel [duplicate]Python3:超出顶层的相对导入[重复]
【发布时间】:2023-03-04 09:26:01
【问题描述】:

是的,有类似的问题,但它们没有回答我的问题。我的目录结构如下,所有的__init__.py文件都是空白的

Package/
    __init__.py
    sub_package1/
           __init__.py
           file1.py
    sub_package2/
            __init__.py
            file2.py

file2.py我有以下代码:

from ..sub_package1 import file1

我得到了上面提到的错误,

ValueError: attempted relative import beyond top-level package

有许多 scikit-learn 包可以进行类似的导入,并且适用于它们。

引发错误的命令:

  1. 工作目录:Package/
  2. 命令:python /path/to/Package/sub_package2/file2.py

【问题讨论】:

  • 能否包含引发异常的“什么命令”?
  • 添加了引发错误的命令。
  • 我链接的副本是一个不同的例外,但解决方案相同(也是@Jean-Paul 在下面回答的相同解决方案)

标签: python python-3.x python-import relative-import


【解决方案1】:

不幸的是,相对导入是否有效取决于您调用代码的方式。

$ mkdir Package Package/sub_package{1,2} 
$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py
$ touch Package/sub_package1/file1.py
$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py

$ python Package/sub_package2/file2.py 
Traceback (most recent call last):
  File "Package/sub_package2/file2.py", line 1, in <module>
    from ..sub_package1 import file1
ValueError: Attempted relative import in non-package

$ python -m Package.sub_package2.file2
$

当您 python Package/sub_package2/file2.py 时,运行时无法识别 Package/sub_package2 是模块路径的一部分。它认为您正在使用的模块只是file2。所以它无法解释 .. 相对导入。

当您使用模块的完整路径导入模块时,就像python -m ... 所做的那样(以及任何正常的导入语句都会这样做),完整的导入路径会被识别,并且可以正确解释相对导入。

【讨论】:

  • 我得到错误(超出顶级):ValueError: attempted relative import beyond top-level package,而不是“非包”
  • 我不确定异常的特定文本是否重要。确实,您遇到的错误路径与我演示的略有不同。但是,这两个错误的根本原因是相同的。使用作为子包的源文件,就好像它是顶级脚本一样。如果您避免这种情况,那么您将不会出现此类错误。
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 2017-02-22
  • 2020-10-20
  • 2020-04-06
  • 2016-05-12
  • 2021-03-21
相关资源
最近更新 更多