Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Package Extension Utility ใน Python (pkgutil)

เมื่อคุณต้องการเพิ่ม 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 ที่เก็บสรุปข้อมูลสั้นของโมดูล