首页 >后端开发 >Python教程 >当模块作为'__main__”运行时,为什么 Python 中的相对导入会失败?

当模块作为'__main__”运行时,为什么 Python 中的相对导入会失败?

DDD
DDD原创
2024-12-19 06:43:10405浏览

Why Do Relative Imports Fail in Python When a Module is Run as `__main__`?

Python 中的相对导入:详细说明

使用包含多个子包的结构化目录时,从其他子包导入模块可以是共同要求。但是,使用相对导入的标准方法(例如 from ..sub2 import mod2)在某些情况下可能会失败。

开发人员尝试在提供的目录结构中从 mod1 导入 mod2 就是这种情况在问题中。错误消息“尝试在非包中进行相对导入”表示相对导入存在问题。

问题的根源在于模块作为 __main__ 运行,并将其作为参数传递给口译员。根据 PEP 328,相对导入使用模块的 __name__ 属性来确定其在包层次结构中的位置。当模块的名称设置为 __main__ 时,无论模块在文件系统中的实际位置如何,都会像模块是顶级模块一样解析相对导入。

尝试导入时,此行为可能会导致混乱来自其他子包的模块。要解决此问题,建议将代码放在脚本中,并使用绝对导入显式导入相关子包,例如 import sub2.mod2.

但是,在 Python 2.6 及更高版本中,引用模块的能力相对于主模块进行了介绍。 PEP 366 描述了这一变化。为了有效地使用相对导入,必须引用主模块而不是使用 __main__。这可以通过多种方式实现,例如:

  • __init__.py 可以声明一个 __package__ 属性来为包含的包分配名称。
  • 使用 __import__() 方法导入子包并赋值给变量。
  • 使用占位符模块 __init__.py 声明 __path__和 __package__ 属性,即使模块为空。

通过采用这些技术,开发人员可以有效地利用相对导入来组织他们的 Python 项目并以结构化方式管理模块之间的依赖关系。

以上是当模块作为'__main__”运行时,为什么 Python 中的相对导入会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn