pkgutil मॉड्यूल पायथन पैकेजेस के लिए इम्पोर्ट नियम बदलने, पैकेज खोज पथ बढ़ाने, और पैकेज के भीतर नॉन-कोड रिसोर्सेस लोड करने की सुविधा देता है।
मुख्य फंक्शन्स
1. extend_path(path, name)
पैकेज के मॉड्यूल्स के लिए खोज पथ बढ़ाता है। पैकेज के __init__.py में उपयोग करें:
import pkgutil __path__ = pkgutil.extend_path(__path__, __name__)
यह sys.path को स्कैन करता है और दिए गए नाम के सबडायरेक्टरी वाले डायरेक्टरीज को जोड़ता है।
2. find_loader(fullname)
दिए गए फुलनेम के लिए मॉड्यूल लोडर प्राप्त करता है।
3. get_importer(path_item)
दिए गए पाथ आइटम के लिए फाइंडर प्राप्त करता है।
4. get_loader(module_or_name)
मॉड्यूल या नाम के लिए लोडर ऑब्जेक्ट लौटाता है।
5. iter_importers(fullname='')
दिए गए मॉड्यूल नाम के लिए फाइंडर ऑब्जेक्ट्स यील्ड करता है।
6. iter_modules(path=None, prefix='')
पाथ पर सभी सबमॉड्यूल्स के लिए ModuleInfo यील्ड करता है। यदि पाथ None है, तो sys.path पर सभी टॉप-लेवल मॉड्यूल्स।
import pkgutil
# सभी टॉप-लेवल मॉड्यूल्स लिस्ट करें
for module_info in pkgutil.iter_modules():
print(module_info.name)
# विशिष्ट पैकेज के सबमॉड्यूल्स
for module_info in pkgutil.iter_modules(['/path/to/package']):
print(module_info.name)
7. walk_packages(path=None, prefix='', onerror=None)
पाथ पर सभी मॉड्यूल्स के लिए रिकर्सिवली ModuleInfo यील्ड करता है।
import pkgutil
import sys
def explore_package(module_name):
loader = pkgutil.get_loader(module_name)
if loader is None:
return
for sub_module in pkgutil.walk_packages([loader.path]):
_, sub_module_name, _ = sub_module
qname = module_name + "." + sub_module_name
print(qname)
explore_package(qname)
# उपयोग
explore_package('os')
8. ModuleInfo
नाम्ड टपल: ModuleInfo(module_finder, name, ispkg) - मॉड्यूल की संक्षिप्त जानकारी।
व्यावहारिक उदाहरण: प्लगइन सिस्टम
import pkgutil
import importlib
def load_plugins(package_name):
"""पैकेज से सभी प्लगइन मॉड्यूल्स लोड करें"""
package = importlib.import_module(package_name)
plugins = {}
for _, module_name, is_pkg in pkgutil.iter_modules(package.__path__, package.__name__ + '.'):
if not is_pkg:
module = importlib.import_module(module_name)
# मान लें कि प्रत्येक प्लगइन में register() फंक्शन है
if hasattr(module, 'register'):
plugins[module_name] = module.register()
return plugins
# plugins/__init__.py में:
# __path__ = pkgutil.extend_path(__path__, __name__)
रिसोर्स एक्सेस
पैकेज के भीतर डेटा फाइल्स पढ़ने के लिए (पायथन 3.7+):
import pkgutil
# बाइनरी डेटा पढ़ें
data = pkgutil.get_data('my_package', 'data/config.json')
print(data.decode('utf-8'))
# या importlib.resources (पायथन 3.7+ अनुशंसित)
from importlib import resources
with resources.open_text('my_package', 'config.json') as f:
content = f.read()
सारांश
| फंक्शन | उद्देश्य |
|---|---|
extend_path | पैकेज खोज पथ बढ़ाएं |
iter_modules | सबमॉड्यूल्स सूचीबद्ध करें |
walk_packages | रिकर्सिव मॉड्यूल खोज |
get_data | पैकेज रिसोर्स पढ़ें |
get_loader | मॉड्यूल लोडर प्राप्त करें |