যখন আপনি কোনো নির্দিষ্ট প্যাকেজের জন্য মডিউল সার্চ প্যাথ বেড়াতে চান বা প্যাকেজে অন্তর্ভুক্ত রিসোর্স নিয়ে কাজ করতে চান, তখন পাইথন লাইব্রেরির pkgutil মডিউল ব্যবহার করতে হবে। এতে পাইথন প্যাকেজের ইম্পোর্ট নিয়ম পরিবর্তন করার ফাংশন রয়েছে। প্যাকেজের ভিতরে বিতরণকৃত ফাইল থেকে নন-কোড রিসোর্স লোড করাও সম্ভব।
extend_path(path, name)
একটি প্যাকেজকে গঠনকারী মডিউলগুলোর সার্চ প্যাথ বেড়ায়। এর উদ্দেশ্য হল প্যাকেজের __init__.py-এ নিচের কোড রাখা:
import pkgutil __path__ = pkgutil.extend_path(__path__, __name__)
extend_path() sys.path স্ক্যান করে যেসব ডিরেক্টরি আছে যাতে প্যাকেজের নামের সাবডিরেক্টরি রয়েছে (দ্বিতীয় আর্গুমেন্ট)। ডিরেক্টরির তালিকাটি প্রথম আর্গুমেন্ট হিসেবে পাস করা প্যাথ ভ্যালুর সাথে কম্বাইন করে একক তালিকা রিটার্ন করে, যা প্যাকেজ ইম্পোর্ট প্যাথ হিসেবে ব্যবহার যোগ্য।
find_loader(fullname): দেওয়া fullname-এর জন্য মডিউল লোডার রিটার্ন করে।
get_importer(path_item): দেওয়া path_item-এর জন্য ফাইন্ডার রিটার্ন করে।
get_loader(module_or_name): module_or_name-এর জন্য লোডার অবজেক্ট পাওয়া যায়।
iter_importers(fullname=''): দেওয়া মডিউল নামের জন্য ফাইন্ডার অবজেক্ট ইয়িল্ড করে।
iter_modules(path=None, prefix=''): path-এ থাকা সব সাবমডিউলের জন্য ModuleInfo ইয়িল্ড করে, যদি path None হয় তবে sys.path-এ থাকা সব টপ-লেভেল মডিউলের জন্য।
>>> pk = pkgutil.iter_modules() >>> for p in pk: ... print(p[1])
walk_packages(path=None, prefix='', onerror=None): path-এ রিকার্সিভলি সব মডিউলের জন্য ModuleInfo ইয়িল্ড করে, 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)
ModuleInfo(module_finder, name, ispkg): একটি মডিউলের সংক্ষিপ্ত সারাংশ ধারণকারী namedtuple রিটার্ন করে।