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“***包之外的相对导入”的主要内容,如果未能解决你的问题,请参考以下文章
错误记录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 )