เมื่อคุณต้องการเพิ่ม Module Search Path สำหรับ Package เฉพาะ และทำงานกับ Resources ที่อยู่ใน Package คุณต้องใช้โมดูล pkgutil จาก Python Library โมดูลนี้มีฟังก์ชันสำหรับเปลี่ยนกฎการ Import สำหรับ Python Packages และสามารถโหลด Non-code Resources จากไฟล์ที่กระจายอยู่ใน Package ได้
extend_path(path, name)
ขยาย Search Path สำหรับโมดูลที่ประกอบเป็น Package วัตถุประสงค์คือวางโค้ดต่อไปนี้ใน __init__.py ของ Package
import pkgutil __path__ = pkgutil.extend_path(__path__, __name__)
extend_path() สแกน sys.path หาไดเรกทอรี่ที่มี Subdirectory ชื่อตรงกับ Package (อาร์กิวเมนต์ตัวที่สอง) รายการไดเรกทอรี่จะรวมกับค่า Path ที่ส่งมาตัวแรกและคืนเป็นรายการเดียว เหมาะสำหรับใช้เป็น Package Import Path
ฟังก์ชันสำคัญอื่นๆ
- find_loader(fullname): ดึง Module Loader สำหรับ fullname ที่กำหนด
- get_importer(path_item): ดึง Finder สำหรับ path_item ที่กำหนด
- get_loader(module_or_name): ได้ Loader Object สำหรับ module_or_name
- iter_importers(fullname=''): Yield Finder Objects สำหรับชื่อโมดูลที่กำหนด
- iter_modules(path=None, prefix=''): Yield ModuleInfo สำหรับ Submodules ทั้งหมดบน Path หรือ Top-level Modules บน sys.path หาก Path เป็น None
- walk_packages(path=None, prefix='', onerror=None): Yield ModuleInfo สำหรับโมดูลทั้งหมดแบบ Recursive บน Path หรือ Accessible Modules ทั้งหมดหาก Path เป็น None
ตัวอย่างการใช้งาน
import pkgutil
import sys
def explore_package(module_name):
loader = pkgutil.get_loader(module_name)
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
ModuleInfo(module_finder, name, ispkg) คืน Named Tuple ที่เก็บสรุปข้อมูลสั้นของโมดูล