繁体   English   中英

Python 如何处理子包?

[英]How does Python handle subpackages?

说 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 找到该模块时,它会将其绑定到本地范围内的一个名称。 这意味着现在定义了 abc 并且可以在当前文件中使用而不会抛出 NameError。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM