pkgutil — 包擴充套件實用程式

原始碼: Lib/pkgutil.py


此模組為匯入系統提供實用程式,特別是包支援。

class pkgutil.ModuleInfo(module_finder, name, ispkg)

一個命名元組,包含模組資訊的簡要摘要。

在 3.6 版本加入。

pkgutil.extend_path(path, name)

擴充套件組成包的模組的搜尋路徑。預期用途是將以下程式碼放在包的 __init__.py

from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)

對於 sys.path 上的每個目錄,如果它有一個與包名匹配的子目錄,則將該子目錄新增到包的 __path__ 中。這在需要將單個邏輯包的不同部分作為多個目錄分發時很有用。

它還會查詢以 * 匹配 name 引數的 *.pkg 檔案。此功能類似於 *.pth 檔案(有關更多資訊,請參閱 site 模組),只是它不會特殊處理以 import 開頭的行。 *.pkg 檔案被視為真實檔案:除了跳過空行和忽略註釋外, *.pkg 檔案中找到的所有條目都會新增到路徑中,無論它們是否存在於檔案系統上(這是一個功能)。

如果輸入路徑不是列表(如凍結包的情況),則原樣返回。輸入路徑不會被修改;而是返回一個擴充套件副本。專案只會被追加到副本的末尾。

假定 sys.path 是一個序列。 sys.path 中不是引用現有目錄的字串的專案將被忽略。 sys.path 上的 Unicode 專案在用作檔名時可能導致錯誤,這可能導致此函式引發異常(與 os.path.isdir() 行為一致)。

pkgutil.get_importer(path_item)

檢索給定 path_itemfinder

如果返回的查詢器是由路徑鉤子新建立的,則它會快取到 sys.path_importer_cache 中。

如果需要重新掃描 sys.path_hooks,可以手動清除快取(或其一部分)。

3.3 版本發生變更: 更新為直接基於 importlib,而不是依賴包內部的 PEP 302 匯入模擬。

pkgutil.iter_importers(fullname='')

為給定模組名生成 finder 物件。

如果 fullname 包含 '.',則查詢器將用於包含 fullname 的包,否則它們將是所有已註冊的頂級查詢器(即 sys.meta_pathsys.path_hooks 上的)。

如果指定名稱的模組位於某個包中,則呼叫此函式會作為副作用匯入該包。

如果未指定模組名稱,則會生成所有頂級查詢器。

3.3 版本發生變更: 更新為直接基於 importlib,而不是依賴包內部的 PEP 302 匯入模擬。

pkgutil.iter_modules(path=None, prefix='')

path 上的所有子模組,或者如果 pathNone,則為 sys.path 上的所有頂級模組生成 ModuleInfo

path 應該為 None 或一個包含模組搜尋路徑的列表。

prefix 是一個字串,用於在輸出時新增到每個模組名稱的前面。

備註

僅適用於定義了 iter_modules() 方法的 finder。此介面非標準,因此模組還為 importlib.machinery.FileFinderzipimport.zipimporter 提供了實現。

3.3 版本發生變更: 更新為直接基於 importlib,而不是依賴包內部的 PEP 302 匯入模擬。

pkgutil.walk_packages(path=None, prefix='', onerror=None)

path 上所有遞迴模組,或者如果 pathNone,則為所有可訪問模組生成 ModuleInfo

path 應該為 None 或一個包含模組搜尋路徑的列表。

prefix 是一個字串,用於在輸出時新增到每個模組名稱的前面。

請注意,此函式必須匯入給定 path 上的所有 不是所有模組!),才能訪問 __path__ 屬性以查詢子模組。

onerror 是一個函式,如果嘗試匯入包時發生任何異常,它將以一個引數(正在匯入的包的名稱)被呼叫。如果未提供 onerror 函式,則 ImportError 將被捕獲並忽略,而所有其他異常將傳播,終止搜尋。

示例:

# list all modules python can access
walk_packages()

# list all submodules of ctypes
walk_packages(ctypes.__path__, ctypes.__name__ + '.')

備註

僅適用於定義了 iter_modules() 方法的 finder。此介面非標準,因此模組還為 importlib.machinery.FileFinderzipimport.zipimporter 提供了實現。

3.3 版本發生變更: 更新為直接基於 importlib,而不是依賴包內部的 PEP 302 匯入模擬。

pkgutil.get_data(package, resource)

從包中獲取資源。

這是 loader get_data API 的包裝器。 package 引數應該是包的名稱,採用標準模組格式(foo.bar)。 resource 引數應採用相對檔名形式,使用 / 作為路徑分隔符。不允許使用父目錄名稱 ..,也不允許使用根名稱(以 / 開頭)。

該函式返回一個二進位制字串,即指定資源的內容。

對於已匯入的檔案系統中的包,這大致相當於

d = os.path.dirname(sys.modules[package].__file__)
data = open(os.path.join(d, resource), 'rb').read()

如果無法找到或載入包,或者它使用不支援 get_dataloader,則返回 None。特別是,名稱空間包loader 不支援 get_data

pkgutil.resolve_name(name)

將名稱解析為物件。

此功能在標準庫的許多地方使用(參見 bpo-12915)——並且等效功能也廣泛用於第三方包,如 setuptools、Django 和 Pyramid。

預計 name 將是以下格式之一的字串,其中 W 是有效 Python 識別符號的簡寫,點在此偽正則表示式中代表字面句點

  • W(.W)*

  • W(.W)*:(W(.W)*)?

第一種形式僅用於向後相容。它假定點分隔名稱的某個部分是一個包,其餘部分是該包中的某個物件,可能巢狀在其他物件中。因為包停止和物件層次結構開始的位置無法透過檢查推斷,所以必須使用此形式重複嘗試匯入。

在第二種形式中,呼叫者透過提供一個冒號明確劃分點:冒號左側的點分隔名稱是要匯入的包,冒號右側的點分隔名稱是該包內的物件層次結構。此形式只需要一次匯入。如果它以冒號結尾,則返回一個模組物件。

該函式將返回一個物件(可能是一個模組),或者引發以下異常之一

ValueError – 如果 name 不在可識別的格式中。

ImportError – 如果匯入失敗,而它不應該失敗。

AttributeError – 如果在遍歷匯入包中的物件層次結構以獲取所需物件時發生故障。

在 3.9 版本中新增。