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

问题描述 投票:2回答:2

我有这个文件设置:

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 python-3.x import packages
2个回答
0
投票

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

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.