gpt4 book ai didi

python - 如何从子包中进行绝对导入?

转载 作者:行者123 更新时间:2023-12-03 18:47:17 25 4
gpt4 key购买 nike

关于包中的导入,有些事情困扰着我。
想象一下,我有以下目录结构:

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

Inside mod1.py I have the following code to import mod2.py:

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

我在包含导入 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.pysub1 ,您可以从 mod1 导入它只需 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 的名称),您可以修改 mod2 的导入来自 mod1是一个明确的相对进口。只需使用 from .. import sub2.mod2 .

关于python - 如何从子包中进行绝对导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com