有些东西让我感到困扰的是包装中的进口.想象一下,我有以下目录结构:
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吗?
sys.path您可以通过在交互式解释器中进行检查来调查这一点。您会发现它的第一个元素是解释器被告知运行的脚本的位置。这意味着当您在顶层(包的位置pack)运行脚本时,会自动添加该位置sys.path。它与实际的包结构没有任何关系,因此如果您mod1.py作为脚本运行,则会出现问题(这可能就是您将脚本放在顶层的原因!)。
请注意,在 Python 2 中,您还存在隐式相对导入的问题,这不会影响您所询问的问题,但如果涉及更多模块,则可能会出现。如果添加mod3.py到sub1,则可以使用mod1just导入它import mod3,并pack.sub1隐式计算出前缀。这种隐式行为通常被认为是一件坏事,并且在 Python 3 中不允许这种隐式相对导入(您也可以在 Python 2 中使用 禁用它们from __future__ import absolute_import)。要导入pack.sub1.mod3,pack.sub1.mod1您需要完整命名它,或者使用显式相对导入:from . import mod3
为了将此相对导入业务与您的问题联系起来,如果您想避免依赖于pack成为 的一部分sys.path(或者,更实际地,防止更改 的pack名称),您可以将mod2from的导入修改mod1为显式相对导入。只需使用from .. import sub2.mod2.
| 归档时间: |
|
| 查看次数: |
635 次 |
| 最近记录: |