如何在子包装内进行绝对进口?

asa*_*sad 5 python python-2.7

有些东西让我感到困扰的是包装中的进口.想象一下,我有以下目录结构:

pack
??? __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()
Run Code Online (Sandbox Code Playgroud)

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

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

Blc*_*ght 3

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

请注意,在 Python 2 中,您还存在隐式相对导入的问题,这不会影响您所询问的问题,但如果涉及更多模块,则可能会出现。如果添加mod3.pysub1,则可以使用mod1just导入它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.

  • 是的,“sys.path”在解释器的整个运行过程中保持不变(当然,除非您用自己的代码修改它)。无论您从何处导入它,您都会获得相同的“sys”模块! (2认同)