包装进口的东西让我很困扰。
假设我有以下目录结构:
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:
您可以通过检查交互式解释器中的
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
。在相关问题 更多 >
编程相关推荐