【问题标题】:PEP 328 "Relative import beyond top level package"PEP 328“顶级包之外的相对导入”
【发布时间】:2018-06-06 07:13:15
【问题描述】:

我有这个文件设置:

mainfolder:
    __init__.py
    mainfile.py
    subfolder1:
        file1.py
        __init__.py
    subfolder2:
        file2.py
        __init__.py

我需要将 mainfile.py 导入到 file1.py 和 file2.py 中。目前我正在使用:

from .. import mainfile

但这会带来错误:尝试相对导入超出顶级包。

我也试过了:

from ...mainfolder import mainfile

这会带来相同的信息,并且:

from mainfolder import mainfile

这带来了错误信息:没有名为'mainfolder'的模块

在 __init __.py 文件中,我有以下代码:

__all__ = [list of files in package]

我不确定为什么这不起作用。如果有人能解释我做错了什么,我将不胜感激。

编辑:运行时出现错误“尝试相对导入超出顶级包”:

from .. import mainfile

在文件 1 中。

【问题讨论】:

  • 你是用python mainfolder/subfolder2/file2.py还是python -m mainfolder.subfolder2.file2调用它?
  • 什么意思?
  • 你怎么称呼/导入会引发“尝试的相对导入超出顶级包”ImportError?
  • python 主文件夹/子文件夹/file2.py

标签: python python-3.x import packages


【解决方案1】:

您不能在被调用的脚本之上进行相对导入。 当您无法将脚本作为模块运行时,我发现修复该错误的最佳方法是在文件开头添加import sys; sys.path += ['../']。这会将父目录添加为查找模块的位置之一,因此您可以只使用import mainfile。如果您要导入的模块位于文件系统中的其他位置,这也适用,只需将 ['../'] 更改为指向包含您要导入的模块的目录的相对路径。

【讨论】:

    【解决方案2】:

    使用包时,Python 需要定义 __package__ 变量以理解相对导入。

    当您调用 python mainfolder/subfolder2/file2.py 时,它会像脚本一样简单地执行 file2.py - 如果没有 __package__,则无法执行任何相关导入。

    当您调用python -m mainfolder.subfolder2.file2 时,您实际上是在告诉 Python,“请执行包 subfolder2 的子包 file2 中的子模块 mainfolder”,因此它为您设置了 __package__,一切正常很好。

    请参阅this answer 进行更深入的讨论。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2020-12-02
      • 1970-01-01
      • 2020-11-03
      • 2017-02-22
      相关资源
      最近更新 更多