כיצד להשתמש ב- PyInstaller ליצירת הפעלות של Python

לפייתון, עוצמתי ורב תכליתי ככל שיהיה, חסרות כמה יכולות מפתח מהקופסה. ראשית, פייתון אינו מספק מנגנון מקורי להרכבת תוכנית פייתון לחבילה הפעלה עצמאית.

כדי להיות הוגנים, מקרה השימוש המקורי של פייתון מעולם לא קרא לחבילות עצמאיות. תוכניות פיתון, בדרך כלל, הופעלו במקום על מערכות בהן היה עותק של מתורגמן הפיתון. אך הפופולריות הגואה של Python יצרה ביקוש רב יותר להפעלת אפליקציות Python במערכות ללא זמן ריצה מותקן של Python.

כמה צדדים שלישיים תכננו פתרונות לפריסת אפליקציות פייתון עצמאיות. הפיתרון הפופולרי ביותר של החבורה, והבוגר ביותר, הוא PyInstaller. PyInstaller לא הופך את תהליך אריזה של אפליקציית Python ללא כאבים לחלוטין, אבל זה עובר שם דרך ארוכה.

במאמר זה נחקור את יסודות השימוש ב- PyInstaller, כולל אופן הפעולה של PyInstaller, כיצד להשתמש ב- PyInstaller ליצירת הפעלת Python עצמאית, כיצד לכוונן את קובצי ההפעלה Python שאתה יוצר וכיצד להימנע מכמה מהמלכודות הנפוצות שעוברות באמצעות PyInstaller.

יצירת חבילת PyInstaller

PyInstaller היא חבילת Python, המותקנת עם pip( pip install pyinstaller). ניתן להתקין את PyInstaller בהתקנת Python המוגדרת כברירת מחדל, אך עדיף ליצור סביבה וירטואלית עבור הפרויקט שברצונך לארוז ולהתקין שם את PyInstaller.

PyInstaller עובד על ידי קריאת תוכנית ה- Python שלך, ניתוח כל הייבוא ​​שהיא מייצרת ואגז עותקים של הייבוא ​​הזה עם התוכנית שלך. PyInstaller קורא בתוכנית שלך מנקודת הכניסה שלה. לדוגמה, אם נקודת הכניסה של התוכנית שלך היא myapp.py, תרוץ pyinstaller myapp.pyלבצע את הניתוח. PyInstaller יכול לזהות ולארוז אוטומטית חבילות Python נפוצות רבות, כמו NumPy, אך ייתכן שתצטרך לספק רמזים במקרים מסוימים. (עוד על כך בהמשך.)

לאחר ניתוח הקוד שלך וגילוי כל הספריות והמודולים שבהם הוא משתמש, PyInstaller מייצר "קובץ מפרט". סקריפט של פייתון עם הסיומת .spec, קובץ זה כולל פרטים על אופן האריזה של אפליקציית פייתון שלך. בפעם הראשונה בה אתה מריץ את PyInstaller באפליקציה שלך, PyInstaller ייצור קובץ מפרט מאפס ויאוכלס בכמה ברירות מחדל שפויות. אל תשליך את הקובץ הזה; זה המפתח לשכלול פריסת PyInstaller!

לבסוף, PyInstaller מנסה לייצר הפעלה מהאפליקציה, יחד עם כל התלות שלה. לאחר סיום, תיקיית משנה בשם dist (כברירת מחדל, אתה רשאי לציין שם אחר) תופיע בספריית הפרויקט. זה בתורו מכיל ספריה שהיא האפליקציה הכלולה שלך - יש לה .exeלהפעיל קובץ, יחד עם כל הספריות וקבצים משלימים אחרים הנדרשים.

כל שעליך לעשות כדי להפיץ את התוכנית שלך, אם כן, הוא לארוז את הספריה הזו .zipכקובץ או כחבילה אחרת. בדרך כלל יהיה צורך לחלץ את החבילה בספרייה שבה למשתמש יש הרשאות כתיבה על מנת לרוץ.

בדיקת חבילת PyInstaller

יש סיכוי סביר שהניסיון הראשון שלך להשתמש ב- PyInstaller לאריזת אפליקציה לא יצליח לחלוטין.

כדי לבדוק אם חבילת PyInstaller שלך עובדת, נווט לספריה המכילה את ההפעלה הכלולה והפעל את .exeשם הקובץ משורת הפקודה. אם היא לא פועלת, השגיאות שתראה מודפסות בשורת הפקודה צריכות לספק רמז למה לא בסדר.

הסיבה השכיחה ביותר שחבילה PyInstaller נכשלת היא ש- PyInstaller לא הצליח לאגד קובץ נדרש. קבצים חסרים כאלה מתחלקים למספר קטגוריות:

  • יבוא נסתר או חסר : לפעמים PyInstaller לא יכול לזהות ייבוא ​​של חבילה או ספרייה, בדרך כלל מכיוון שהיא מיובאת באופן דינמי. יש לציין את החבילה או הספרייה באופן ידני.
  • חסרים קבצים עצמאיים : אם התוכנית תלויה בקבצי נתונים חיצוניים שיש לצרף יחד עם התוכנית, ל- PyInstaller אין שום דרך לדעת. יהיה עליך לכלול ידנית את הקבצים.
  • חסרים קבצים בינאריים חסרים : שוב כאן, אם התוכנית שלך תלויה בבינארי חיצוני כמו .DLL ש- PyInstaller לא יכול לזהות, יהיה עליך לכלול אותו ידנית.

החדשות הטובות הן ש- PyInstaller מספק דרך קלה להתמודד עם הבעיות הנ"ל. .specהקובץ נוצר על ידי PyInstaller כולל שדות נוכל למלא לספק את הפרטים PyInstaller החמיץ.

פתח את .specהקובץ בעורך טקסט וחפש את הגדרת Analysisהאובייקט. כמה מהפרמטרים שעברו Analysisהם רשימות ריקות, אך ניתן לערוך אותם כדי לציין את הפרטים החסרים:

  • hiddenimportsלייבוא ​​סמוי או חסר : הוסף לרשימה זו מחרוזת אחת או יותר עם שמות הספריות שברצונך לכלול באפליקציה שלך. אם אתה רוצה להוסיף pandasו bokeh, למשל, היית לציין כי כפי  ['pandas','bokeh']. הערה כי ספריות נדון חייבות להיות מותקנות באותו המופע של פיתון שבו אתה מפעיל PyInstaller.
  • datasלהעדר קבצים עצמאיים : הוסף כאן מפרט אחד או יותר לקבצים בעץ הפרויקט שלך שברצונך לכלול בפרויקט שלך. יש להעביר כל קובץ ככפול המציין את הנתיב היחסי לקובץ בספריית הפרויקט שלך ואת הנתיב היחסי בספריית ההפצה שבה ברצונך למקם את הקובץ. לדוגמה, אם היה ברשותך קובץ ./models/mainmodel.datשרצית לכלול באפליקציה שלך וברצונך למקם אותו בספריית משנה תואמת בספריית ההפצה שלך, היית משתמש ('./models/mainmodel.dat','./models')כערך אחד hiddenimportsברשימה. שים לב שאתה יכול להשתמש globבתווים כלליים בסגנון כדי לציין יותר מקובץ אחד.
  • binariesלהחמצת בינאריות עצמאיות חסרות : כמו למשל datas, ניתן binariesלהעביר רשימה של צמרות המפרטות את מיקומי הבינאריות בעץ הפרויקט ויעדיהם בספריית ההפצה. שוב, אתה יכול להשתמש globבתווים כלליים בסגנון.

זכור כי כל אחת מהרשימות שעוברות אליהן Analysisיכולה להיווצר באופן פרוגרמטי מוקדם יותר .specבקובץ. אחרי הכל, .specהקובץ הוא רק סקריפט פייתון בשם אחר.

לאחר ביצוע שינויים .specבקובץ, הפעל מחדש את PyInstaller כדי לבנות מחדש את החבילה. עם זאת, מעתה, הקפד להעביר את .specהקובץ שהשתנה כפרמטר (למשל pyinstaller myapp.spec). בדוק את ההפעלה כמו קודם. אם משהו עדיין נשבר, אתה יכול לערוך מחדש את .specהקובץ ולחזור על התהליך עד שהכל עובד.

לבסוף, כשאתה מרוצה שהכל עובד כמתוכנן, ייתכן שתרצה לערוך את  .specהקובץ כדי למנוע מהאפליקציה הארוזה שלך להציג חלון שורת פקודה בעת ההשקה. ב EXEגדרות האובייקט .specהקובץ, להגדיר  console=False. דיכוי המסוף שימושי אם לאפליקציה שלך יש ממשק משתמש ואינך רוצה שחלון שורת פקודה מזויף יוביל את המשתמשים לסטייה. כמובן, אל תשנה הגדרה זו אם האפליקציה שלך דורשת שורת פקודה.

זיקוק חבילת PyInstaller

לאחר שאפליקציית PyInstaller ארוזה כהלכה, הדבר הבא שתרצו לעשות הוא להקטין אותה מעט. חבילות PyInstaller אינן ידועות כמעודדות.

מכיוון שפייתון היא שפה דינמית, קשה לחזות בדיוק מה יהיה צורך בזמן ריצה על ידי תוכנית נתונה. מסיבה זו, כאשר PyInstaller מזהה ייבוא ​​חבילה, הוא כולל את כל החבילה, בין אם הוא משמש בפועל בזמן הריצה על ידי התוכנית שלך. 

הנה החדשות הטובות. PyInstaller כולל מנגנון להדרה סלקטיבית של חבילות שלמות, או מרחבי שמות בודדים בתוך חבילות. למשל, נניח חבילה יבוא התוכנית שלך foo, הכולל foo.barו foo.bip. אם אתה יודע foo.barבוודאות שהתוכנית שלך משתמשת רק בהיגיון , תוכל להחריג foo.bip ולחסוך מקום בבטחה .

לשם כך, השתמש excludesבפרמטר המועבר Analysisלאובייקט .specבקובץ. אתה יכול להעביר רשימת שמות - מודולים ברמה העליונה או מרחבי שמות מנוקדים - כדי לא לכלול בחבילה שלך. לדוגמה, כדי לא לכלול foo.bip, פשוט היית מציין  ['foo.bip'].

אי הכללה נפוצה אחת שתוכל לבצע היא tkinter, ספריית פייתון ליצירת ממשקי משתמש גרפיים פשוטים בין פלטפורמות. כברירת מחדל,  tkinterוכל קבצי התמיכה שלו ארוזים בפרויקט PyInstaller. אם אינך משתמש tkinterבפרויקט שלך, אתה יכול להוציא אותו על ידי הוספת 'tkinter'אל excludesהרשימה. השמטה tkinterתפחית את גודל החבילה בכ- 7 מגהבייט.

הדרה נפוצה נוספת היא סוויטות בדיקה. אם לחבילה שתוכנתך מייבאת יש חבילת בדיקה, חבילת הבדיקה עלולה בסופו של דבר להיכלל בחבילת PyInstaller שלך. אלא אם כן אתה באמת מריץ את חבילת הבדיקה בתוכנית הפריסה שלך, אתה יכול להחריג אותה בבטחה.

זכור כי יש לבדוק היטב את החבילות שנוצרו באמצעות אי הכללות לפני השימוש בהן. אם בסופו של דבר אתה לא כולל פונקציונליות המשמשת בתרחיש עתידי כלשהו שלא ציפית, האפליקציה שלך תישבר.

טיפים של PyInstaller

  • בנה את חבילת PyInstaller שלך במערכת ההפעלה שעליה אתה מתכנן לפרוס.  PyInstaller אינו תומך בבנייה חוצה פלטפורמות. אם אתה צריך לפרוס את אפליקציית Python העצמאית שלך במערכות MacOS, Linux ו- Windows, יהיה עליך להתקין את PyInstaller ולבנות גרסאות נפרדות של האפליקציה בכל אחת ממערכות ההפעלה הללו. 
  • בנה את חבילת PyInstaller שלך כשאתה מפתח את האפליקציה שלך.  ברגע שאתה יודע שתפרוס את הפרויקט שלך עם PyInstaller, בנה את .specהקובץ שלך והתחל לשכלל את חבילת PyInstaller במקביל לפיתוח האפליקציה שלך. בדרך זו תוכל להוסיף אי הכללות או הכללות תוך כדי תנועה, ולבדוק את האופן שבו תכונות חדשות נפרסות באפליקציה תוך כדי כתיבתן.
  • אל תשתמש --onefileבמצב של PyInstaller  .  PyInstaller כולל מתג שורת פקודה, שמארז --onefileאת כל האפליקציה שלך להפעלה יחידה של חילוץ עצמי. זה נשמע רעיון נהדר - אתה רק צריך לספק קובץ אחד! - אבל יש לזה כמה מלכודות. בכל פעם שאתה מפעיל את האפליקציה, תחילה עליה לפרוק את כל הקבצים בתוך ההפעלה לספריה זמנית. אם האפליקציה גדולה (למשל 200 מגה-בייט), פריקה של פירוק יכולה להיות עיכוב של מספר שניות. השתמש במקום זאת במצב ברירת המחדל של ספריה יחידה, ופשוט ארז הכל .zipכקובץ.
  • צור מתקין לאפליקציית PyInstaller שלך.  אם אתה רוצה דרך כלשהי לפרוס את האפליקציה שלך מלבד קובץ ZIP, שקול להשתמש בכלי שירות להתקנה כמו מערכת ההפעלה Nullsoft Scriptable עם קוד פתוח. זה מוסיף מעט מאוד תקורה לגודל המשלוח ומאפשר לך להגדיר היבטים רבים של תהליך ההתקנה, כמו יצירת קיצורי דרך להפעלה שלך.
  • אל תצפו למהירות מהירה.  PyInstaller היא  מערכת אריזה , לא  מהדר  או  מייעל . קוד ארוז עם PyInstaller אינו פועל מהר יותר ממה שהוא פועל במערכת המקורית. אם אתה רוצה להאיץ את קוד הפייתון, השתמש בספרייה מואצת ב- C המתאימה למשימה, או בפרויקט כמו Cython.

איך לעשות יותר עם פייתון

  • מדריך Cython: כיצד להאיץ את Python
  • כיצד להתקין את פייתון בדרך החכמה
  • ניהול פרויקטים טוב יותר של פייתון עם שירה
  • Virtualenv ו- venv: הסברים על סביבות וירטואליות של Python
  • Python virtualenv ו- venv do's and donts
  • הסבר על השחלת פיתון ותהליכי משנה
  • כיצד להשתמש בבאגים של פייתון
  • כיצד להשתמש ב- timeit לפרופיל קוד פייתון
  • כיצד להשתמש ב- cProfile לפרופיל קוד פייתון
  • התחל לעבוד עם אסינכרון בפייתון
  • כיצד להשתמש ב- asyncio בפייתון
  • כיצד להמיר את פייתון ל- JavaScript (ובחזרה)