pkgutil
— 包擴充套件實用工具¶
原始碼: Lib/pkgutil.py
此模組為匯入系統提供實用工具,特別是包支援。
- class pkgutil.ModuleInfo(module_finder, name, ispkg)¶
一個 namedtuple,用於儲存模組資訊的簡短摘要。
3.6 版本新增。
- pkgutil.extend_path(path, name)¶
擴充套件構成包的模組的搜尋路徑。預期用途是將以下程式碼放置在包的
__init__.py
中from pkgutil import extend_path __path__ = extend_path(__path__, __name__)
對於
sys.path
上具有與包名稱匹配的子目錄的每個目錄,將子目錄新增到包的__path__
。如果想要將單個邏輯包的不同部分作為多個目錄分發,這將非常有用。它還會查詢以
*.pkg
開頭的檔案,其中*
與 name 引數匹配。此功能類似於*.pth
檔案(有關詳細資訊,請參閱site
模組),不同之處在於它不會特殊處理以import
開頭的行。*.pkg
檔案被認為是可信的:除了跳過空行和忽略註釋之外,在*.pkg
檔案中找到的所有條目都會新增到路徑中,無論它們是否存在於檔案系統上(這是一個功能)。如果輸入路徑不是列表(對於凍結包就是這種情況),則返回不變的路徑。不會修改輸入路徑;會返回擴充套件副本。專案僅在末尾追加到副本中。
假設
sys.path
是一個序列。sys.path
中不是引用現有目錄的字串的專案將被忽略。sys.path
中作為檔名使用時會導致錯誤的 Unicode 專案可能會導致此函式引發異常(與os.path.isdir()
行為一致)。
- pkgutil.find_loader(fullname)¶
檢索給定 fullname 的模組 載入器。
這是
importlib.util.find_spec()
周圍的向後相容性包裝器,它將大多數失敗轉換為ImportError
,並且僅返回載入器,而不是完整的importlib.machinery.ModuleSpec
。3.4 版本更改: 已更新為基於 PEP 451
3.12 版本中已棄用, 將在 3.14 版本中刪除: 請改用
importlib.util.find_spec()
。
- pkgutil.get_importer(path_item)¶
檢索給定 path_item 的 查詢器。
如果返回的查詢器是由路徑鉤子新建立的,則會將其快取在
sys.path_importer_cache
中。如果需要重新掃描
sys.path_hooks
,可以手動清除快取(或其中的一部分)。
- pkgutil.get_loader(module_or_name)¶
獲取 module_or_name 的 載入器 物件。
如果可以透過正常的匯入機制訪問模組或包,則會返回該機制的相關部分的包裝器。如果找不到或無法匯入模組,則返回
None
。如果尚未匯入命名模組,則會匯入其包含的包(如果有),以便建立包__path__
。3.4 版本更改: 已更新為基於 PEP 451
3.12 版本中已棄用, 將在 3.14 版本中刪除: 請改用
importlib.util.find_spec()
。
- pkgutil.iter_importers(fullname='')¶
為給定的模組名稱生成 查詢器 物件。
如果 fullname 包含
'.'
,則查詢器將用於包含 fullname 的包,否則它們將是所有註冊的頂級查詢器(即sys.meta_path
和sys.path_hooks
上的查詢器)。如果命名模組位於包中,則呼叫此函式會作為副作用匯入該包。
如果未指定模組名稱,則會生成所有頂級查詢器。
- pkgutil.iter_modules(path=None, prefix='')¶
為 path 上的所有子模組生成
ModuleInfo
。如果 path 為None
,則為sys.path
上的所有頂級模組生成ModuleInfo
。path 應該是
None
或用於查詢模組的路徑列表。prefix 是一個字串,用於輸出時新增到每個模組名稱的前面。
注意
僅適用於定義了
iter_modules()
方法的 查詢器。此介面為非標準介面,因此該模組還為importlib.machinery.FileFinder
和zipimport.zipimporter
提供了實現。
- pkgutil.walk_packages(path=None, prefix='', onerror=None)¶
為 path 上的所有模組遞迴生成
ModuleInfo
,如果 path 為None
,則為所有可訪問的模組生成。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()
方法的 查詢器。此介面為非標準介面,因此該模組還為importlib.machinery.FileFinder
和zipimport.zipimporter
提供了實現。
- pkgutil.get_data(package, resource)¶
從包中獲取資源。
這是 載入器
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
的 載入器,則返回None
。特別是,名稱空間包 的 載入器 不支援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 版本中新增。