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_item 的 finder。
如果返回的查詢器是由路徑鉤子新建立的,則它會快取到
sys.path_importer_cache
中。如果需要重新掃描
sys.path_hooks
,可以手動清除快取(或其一部分)。
- pkgutil.iter_importers(fullname='')¶
為給定模組名生成 finder 物件。
如果 fullname 包含
'.'
,則查詢器將用於包含 fullname 的包,否則它們將是所有已註冊的頂級查詢器(即sys.meta_path
和sys.path_hooks
上的)。如果指定名稱的模組位於某個包中,則呼叫此函式會作為副作用匯入該包。
如果未指定模組名稱,則會生成所有頂級查詢器。
- pkgutil.iter_modules(path=None, prefix='')¶
為 path 上的所有子模組,或者如果 path 為
None
,則為sys.path
上的所有頂級模組生成ModuleInfo
。path 應該為
None
或一個包含模組搜尋路徑的列表。prefix 是一個字串,用於在輸出時新增到每個模組名稱的前面。
備註
僅適用於定義了
iter_modules()
方法的 finder。此介面非標準,因此模組還為importlib.machinery.FileFinder
和zipimport.zipimporter
提供了實現。
- pkgutil.walk_packages(path=None, prefix='', onerror=None)¶
為 path 上所有遞迴模組,或者如果 path 為
None
,則為所有可訪問模組生成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.FileFinder
和zipimport.zipimporter
提供了實現。
- 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_data
的 loader,則返回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 版本中新增。