באיזה מודולים הסקריפט שלי משתמש
הרבה פעמים מעניין אותנו להריץ סקריפט ולזהות באיזה מודולים שיש לנו על המכונה הסקריפט משתמש, למשל כדי שנוכל לבנות סביבה וירטואלית עבור הרצת סקריפט זה. מסתבר שלפייתון יש פיתרון ממש פשוט לבעיה, והוא נקרא modulefinder.
קחו את התוכנית הבאה לדוגמא:
import re
import sys
for line in sys.stdin:
if re.search(r'\b[A-Z][a-z]*\b', line):
sys.stdout.write(line)
else:
print("No interesting words found")
בשביל לגלות באיזה מודולים היא משתמשת, ומי מהם הותקן בצורה חיצונית, נוכל להשתמש ב modulefinder. בהנחה ששמרתי את הסקריפט בקובץ בשם hello.py התוכנית הבאה תדפיס את כל המודולים שהקובץ מייבא, ועבור כל מודול תדפיס האם הוא הגיע עם פייתון או הותקן בנפרד:
from modulefinder import ModuleFinder
from stdlib_list import stdlib_list
libraries = stdlib_list("3.7")
import sys
finder = ModuleFinder()
finder.run_script('hello.py')
print('Loaded modules:')
for name, mod in finder.modules.items():
if '.' in name: continue
if name in sys.builtin_module_names: continue
print('%s: ' % name, end='')
if name in libraries:
print("Builtin module")
else:
print("External module")
כמה הערות:
בשביל להשתמש ב modulefinder אנחנו צריכים בסך הכל להריץ את הסקריפט עם
finder.run_script
ואחרי זה לקרוא את הרשימה מfinder.modules
.אני משתמש בשתי היוריסטיקות כדי לדעת אם מודול הוא חלק מפייתון. זה מכסה חלק מהמקרים אבל עדיין לא את כולם. הספריה
stdlib_list
לוקחת מהאתר של פייתון את רשימת המודולים ששייכים לגירסא מסוימת, והמשתנהsys.builtin_module_names
מכיל את רשימת המודולים שבנויים לתוך פייתון. עדיין יש מודולים שהם חלק ממודול אחר, לדוגמא_ssl
שהוא חלק ממודולssl
ואותם הסקריפט לא מזהה כמודולים פנימיים. רעיונות להיפטר ממודולים אלה יתקבלו בברכה.