modulefinder --- یافتن ماژول‌های استفاده‌شده توسط یک اسکریپت

کد منبع: Lib/modulefinder.py


این ماژول یک کلاس ModuleFinder را ارائه می‌دهد که می‌توان از آن برای تعیین مجموعه ماژول‌های ایمپورت‌شده توسط یک اسکریپت استفاده کرد. همچنین می‌توان modulefinder.py را به‌عنوان یک اسکریپت اجرا کرد، به‌طوری که نام پرونده یک اسکریپت پایتون به‌عنوان آرگومان آن داده شود؛ پس از آن، گزارشی از ماژول‌های ایمپورت‌شده چاپ خواهد شد.

modulefinder.AddPackagePath(pkg_name, path)

ثبت کنید که بسته‌ای به نام pkg_name را می‌توان در path مشخص‌شده یافت.

modulefinder.ReplacePackage(oldname, newname)

به شما امکان می‌دهد مشخص کنید که ماژولی به نام oldname در واقع بسته‌ای به نام newname است.

class modulefinder.ModuleFinder(path=None, debug=0, excludes=[], replace_paths=[])

این کلاس، متدهای run_script() و report() را برای تعیین مجموعه‌ای از ماژول‌های ایمپورت‌شده توسط یک اسکریپت فراهم می‌کند. path می‌تواند فهرستی از پوشه‌ها برای جست‌وجوی ماژول‌ها باشد؛ اگر مشخص نشده باشد، از sys.path استفاده می‌شود. debug سطح اشکال‌زدایی را تنظیم می‌کند؛ مقادیر بالاتر باعث می‌شود که کلاس پیام‌های اشکال‌زدایی درباره‌ی آنچه انجام می‌دهد را چاپ کند. excludes فهرستی از نام ماژول‌ها برای حذف از تحلیل است. replace_paths فهرستی از تاپل‌های (oldpath, newpath) است که در مسیرهای ماژول جایگزین خواهند شد.

report()

گزارشی را در خروجی استاندارد چاپ می‌کند که ماژول‌های ایمپورت‌شده توسط اسکریپت و مسیرهای آن‌ها و همچنین ماژول‌هایی را که موجود نیستند یا به نظر می‌رسد موجود نیستند، فهرست می‌کند.

run_script(pathname)

محتوای پرونده pathname را تحلیل می‌کند؛ این پرونده باید حاوی کد پایتون باشد.

modules

یک دیکشنری که نام ماژول‌ها را به ماژول‌ها نگاشت می‌کند. نمونه‌ای از کاربرد ModuleFinder را ببینید.

نمونه‌ای از کاربرد ModuleFinder

اسکریپتی که در ادامه تحلیل خواهد شد (bacon.py):

import re, itertools

try:
    import baconhameggs
except ImportError:
    pass

try:
    import guido.python.ham
except ImportError:
    pass

اسکریپتی که گزارش bacon.py را خروجی خواهد داد:

from modulefinder import ModuleFinder

finder = ModuleFinder()
finder.run_script('bacon.py')

print('Loaded modules:')
for name, mod in finder.modules.items():
    print('%s: ' % name, end='')
    print(','.join(list(mod.globalnames.keys())[:3]))

print('-'*50)
print('Modules not imported:')
print('\n'.join(finder.badmodules.keys()))

خروجی نمونه (ممکن است بسته به معماری متفاوت باشد):

Loaded modules:
_types:
copyreg:  _inverted_registry,_slotnames,__all__
re._compiler:  isstring,_sre,_optimize_unicode
_sre:
re._constants:  REPEAT_ONE,makedict,AT_END_LINE
sys:
re:  __module__,finditer,_expand
itertools:
__main__:  re,itertools,baconhameggs
re._parser:  _PATTERNENDERS,SRE_FLAG_UNICODE
array:
types:  __module__,IntType,TypeType
---------------------------------------------------
Modules not imported:
guido.python.ham
baconhameggs