PEP 328"超越顶级包装的相对进口"

时间:2017-12-24 15:07:47

标签: python python-3.x import packages

我有这个文件设置:

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中。

2 个答案:

答案 0 :(得分:0)

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

当您致电python mainfolder/subfolder2/file2.py时,它只是像脚本一样执行file2.py - 并且,如果没有__package__,则无法执行任何相对导入。

当您致电python -m mainfolder.subfolder2.file2时,您实际上是在告诉Python,"请执行包file2的子包subfolder2中的子模块mainfolder ",所以它为你设置__package__,一切正常。

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

答案 1 :(得分:0)

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