簡體   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