如何从一个子包装中进行绝对进口?

2024-05-06 09:00:47 发布

您现在位置:Python中文网/ 问答频道 /正文

包装进口的东西让我很困扰。 假设我有以下目录结构:

pack
├── __init__.py
├── sub1
│   ├── __init__.py
│   └── mod1.py
└── sub2
    ├── __init__.py
    └── mod2.py

在mod1.py中,我有以下代码来导入mod2.py:

^{pr2}$

我有一个主.py包含导入pack/sub1/mod1.py的包的目录中的文件

mod1.py如何访问pack?pack与mod1.py不在同一目录中。python是否会自动将最上面的包添加到系统路径?在


Tags: 文件代码py路径目录init系统结构
1条回答
网友
1楼 · 发布于 2024-05-06 09:00:47

您可以通过检查交互式解释器中的sys.path来研究这一点。您会发现,它的第一个元素是要求解释器运行的脚本的位置。这意味着当您在顶层(即pack包的位置)运行脚本时,该位置将自动添加到sys.path中。它与实际的包结构没有任何关系,因此,如果您将mod1.py作为脚本运行,则会出现问题(这可能是您将脚本放在顶层的原因!)。在

请注意,在python2中,还存在隐式相对导入的问题,这不会影响您所询问的问题,但如果涉及到更多的模块,则可能会出现这种问题。如果您将mod3.py添加到sub1,则可以从{}导入它,只需import mod3,并隐式地计算出pack.sub1前缀。这种隐式行为通常被认为是一件坏事,在python3中不允许这样的隐式相对导入(您也可以在python2中使用from __future__ import absolute_import禁用它们)。要从pack.sub1.mod1导入pack.sub1.mod3,您需要完整地命名它,或者使用显式的相对导入:from . import mod3

为了将这个相对导入业务与您的问题联系起来,如果您希望避免依赖pack作为sys.path的一部分(或者,更现实地说,防止pack名称的更改),您可以将mod2的导入从mod1修改为显式的相对导入。只需使用from .. import sub2.mod2。在

相关问题 更多 >