Module pkgutil trong thư viện chuẩn cung cấp công cụ mở rộng đường dẫn tìm kiếm module cho package và làm việc với resource bên trong package.
Chức năng chính
- Mở rộng import path cho package (
extend_path). - Tìm loader, importer cho module.
- Duyệt các submodule, package (
iter_modules,walk_packages). - Đọc resource non-code từ file trong package.
extend_path(path, name)
Mở rộng đường dẫn tìm kiếm cho các module cấu thành package. Dùng trong __init__.py của package:
import pkgutil __path__ = pkgutil.extend_path(__path__, __name__)
Quét sys.path tìm thư mục con tên package, kết hợp với path gốc trả về list thống nhất.
Các hàm quan trọng khác
| Hàm | Mô tả |
|---|---|
find_loader(fullname) | Lấy module loader cho fullname |
get_importer(path_item) | Lấy finder cho path_item |
get_loader(module_or_name) | Lấy loader object |
iter_importers(fullname='') | Yield finder objects cho module name |
iter_modules(path=None, prefix='') | Yield ModuleInfo cho submodules trên path (hoặc top-level trên sys.path) |
walk_packages(path=None, prefix='', onerror=None) | Yield ModuleInfo đệ quy cho tất cả module trên path |
Ví dụ: Liệt kê tất cả module top-level
import pkgutil
for module_info in pkgutil.iter_modules():
print(module_info.name)
Ví dụ: Duyệt đệ quy package
import pkgutil
import sys
def explore_package(module_name):
loader = pkgutil.get_loader(module_name)
if loader is None or not hasattr(loader, 'filename'):
return
for sub_module in pkgutil.walk_packages([loader.filename]):
_, sub_module_name, _ = sub_module
qname = module_name + "." + sub_module_name
print(qname)
explore_package(qname)
explore_package('os')
ModuleInfo
Named tuple: ModuleInfo(module_finder, name, ispkg) - tóm tắt thông tin module.
Ứng dụng thực tế
- Plugin system: Tự động khám phá và load plugin từ thư mục.
- Namespace package: Chia package trên nhiều thư mục/phân phối.
- Introspection: Phân tích cấu trúc package tại runtime.