如何从子包中绝对导入?

阿萨德

关于软件包导入的问题令我感到困扰。想象一下,我有以下目录结构:


├──的__init__.py 
├──SUB1
展示│├──的__init__.py
展示│└──mod1.py 
└──SUB2 
    ├──的__init__.py 
    └──mod2.py

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

# mod1.py
import pack.sub2.mod2
pack.sub2.mod2.helloworld()

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

mod1.py如何访问包?pack与mod1.py不在同一目录中。python是否会自动将最顶层的软件包添加到sys.path?

布莱克金

您可以通过sys.path在交互式解释器中进行检查来进行调查您会发现,它的第一个元素是告诉解释器运行的脚本的位置。这意味着,当您在顶层(pack的位置运行脚本时,该位置会sys.path自动添加到该位置它与实际的程序包结构没有任何关系,因此,如果您mod1.py以脚本身份运行,则会导致事情中断(这可能就是为什么将脚本置于顶层的原因!)。

请注意,在Python 2中,您还遇到了隐式相对导入的问题,这不会影响您所询问的问题,但是如果您涉及更多模块,可能会出现。如果添加mod3.pysub1,则可以mod1使用just导入import mod3,并pack.sub1隐式找出前缀。这种隐式行为通常被认为是一件坏事,在Python 3中,这种隐式相对导入是不允许的(您也可以在Python 2中使用禁用它们from __future__ import absolute_import)。要从中导入pack.sub1.mod3pack.sub1.mod1需要全称或使用显式相对导入:from . import mod3

要将这个相对导入业务与您的问题联系起来,如果您想避免依赖pack一部分sys.path(或更实际地,避免更改pack的名称),则可以将mod2from的导入修改mod1为一个明确的相对导入。只需使用from .. import sub2.mod2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章