gpt4 book ai didi

python - Python 如何处理子包?

转载 作者:行者123 更新时间:2023-12-03 20:19:30 25 4
gpt4 key购买 nike

假设 Ansible 是通过“pip install ansible”安装的。安装后,以下导入语句成功:

from ansible.module_utils.basic import AnsibleModule

现在,创建了一个名为“ansible.module_utils.custom”的本地包。目录结构:
 ansible/
__init__.py
module_utils/
__init__.py
custom/
__init__.py
utils.py

一旦这样做,上述导入语句就会失败。声称“基本”是未定义的。本地包确实没有声明“基本”子包。只有安装的 Ansible 库可以。似乎 Python 仅将其搜索限制在本地包中。

我的印象是 Python 在放弃查找代码之前会考虑完整的系统路径。它将回溯到本地包并最终访问已安装的 Ansible 库。

这是一个不正确的假设吗?如果是这样,是否有可能使本地包与已安装的包共存?

最佳答案

导入的工作原理

import abc

Python 要做的第一件事是在 sys.modules 中查找名称 abc。这是之前导入的所有模块的缓存。

如果在模块缓存中找不到该名称,Python 将继续搜索内置模块列表。这些是 Python 预装的模块,可以在 Python 标准库中找到。如果在内置模块中仍未找到该名称,Python 然后在 sys.path 定义的目录列表中搜索它。此列表通常包括当前目录,首先搜索该目录。

当 Python 找到该模块时,它会将其绑定(bind)到本地范围内的名称。这意味着现在定义了 abc 并且可以在当前文件中使用而不会引发 NameError。

如果从未找到该名称,您将收到 ModuleNotFoundError。您可以在 Python 文档 here 中找到有关导入的更多信息。 !

关于python - Python 如何处理子包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60169675/

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