PEP 328“***包之外的相对导入”

Posted

技术标签:

【中文标题】PEP 328“***包之外的相对导入”【英文标题】:PEP 328 "Relative import beyond top level package" 【发布时间】: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 【参考方案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 进行更深入的讨论。

【讨论】:

以上是关于PEP 328“***包之外的相对导入”的主要内容,如果未能解决你的问题,请参考以下文章

Python:在主程序和 PEP 8 开头导入

PEP8 - 使用 sys.path 导入不在文件顶部

Python编写规则值得收藏

错误记录PyCharm 运行 Python 程序报错 ( PEP 8: E402 module level import not at top of file )

错误记录PyCharm 运行 Python 程序报错 ( PEP 8: E402 module level import not at top of file )

导入内部函数是pythonic吗?