当前位置: 首页 > 知识库问答 >
问题:

PEP 328“顶层封装之外的相对导入”

东方华晖
2023-03-14

我有这样的文件设置:

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
__all__ = [list of files in package]

编辑:当我运行时,出现了“试图相对导入超出顶级包”的错误:

from .. import mainfile

在文件%1中。

共有1个答案

司寇飞航
2023-03-14

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

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

当您调用Python-m mainfolder.subfolder2.file2时,您实际上是在告诉Python:“请在包mainfolder的子包subfolder2中执行子模块file2”,这样它就为您设置了__package__并且一切正常。

有关更深入的讨论,请参见此答案。

 类似资料:
  • 为了更好地理解Python的导入系统是如何工作的,我在玩Python的导入系统时遇到了另一个问题。我有以下结构 在中有以下代码: 在中有以下内容: 但为什么?我该怎么解决呢?我正在从空闲中运行,应该被认为是一个包,因为它有文件。 第一个导入很好,但以下内容不起作用: 因为我试图从父包导入一些东西,但显然我不能,因为一些奇怪的原因。

  • 如何在Python中从低级目录导入类? 我一直在阅读如何将添加到文件夹中(或者这只是在Python2中吗?)或者如何使用,但是这些都不起作用。 通过下面的代码,我得到了:valueerror:尝试相对导入超出顶级包 文件2.py 谢谢你。

  • 这里似乎已经有很多关于Python3中的相对导入的问题,但是在研究了其中的许多问题之后,我仍然没有找到我的问题的答案。所以问题就在这里。 我有一个包裹如下所示 一切都很好. 现在我的问题是:当我在文件夹中,并且我将test_A子包中的模块作为运行时,根据我的理解,只上一级,仍然在文件夹中,为什么它给出的消息是。到底是什么原因导致了这个错误信息呢?

  • python 3.7.7,并在python 3.6.0上试用 我正在使用Django服务器,在我的views.py中 我正试着在探测器里得到我的函数。 我,我把我的探测器文件作为一个包返回到一个文件中, 我阅读了关于这个问题的所有stackoverflow问题。

  • 问题内容: 这是我的文件夹结构: 在我有: 在时: 现在,当我发出: 我得到: 由于“多份原件打印”是在sys.path中,并正确地解决它为什么抱怨相对进口上述顶层包? 这是顶层包 ? 顺便说一句,这是我向旧项目中添加测试的尝试-在Python测试包布局中曾提出过要求,但作为Python单元测试去哪儿的副本被关闭了。对我当前的测试包布局的评论深表感谢! 那么下面的答案不适用于我的情况: 该 模块

  • 这是我的文件结构: MainDir/ |Foo.py |SubDir/ || ||Bar.py 富。py: 酒吧py: 通过这段代码,我试图从Foo中获取var的值,并将其保存在Bar中 我在运行Foo时遇到此错误。py(和Bar.py):ImportError尝试在顶级包之外进行相对导入 我知道有很多这样的问题,但是我没有通过查看所有的问题来解决它。我被困在这个问题上大约一周了。提前谢谢!