• בלוג
  • עמוד 2
  • טיפים לעבודה יעילה על מספר סביבות פייתון במקביל

טיפים לעבודה יעילה על מספר סביבות פייתון במקביל

25/12/2020

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

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

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

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

1. התקנת מספר גירסאות פייתון עם pyenv

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

אני משתמש בכלי בשם pyenv בשביל זה. פייאנב מתקין תיקיה של קבצי הפעלה "מזויפים" (נקראים shims) ובאופן אוטומטי כשאנחנו מפעילים את הפקודה python מתוך תיקיית ה shims הפקודה מזהה איזה גירסת פייתון אנחנו "צריכים" ומפעילה את הגירסה הנכונה.

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

בשביל להתקין את pyenv יש לכם תהליך די מסורבל אבל לשמחתנו חד פעמי שמתואר טוב בדף ה README שלהם. זה הלינק עבור מכונות מק ולינוקס: https://github.com/pyenv/pyenv

וזה הלינק עבור מכונות ווינדוס: https://github.com/pyenv-win/pyenv-win

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

$ pyenv versions
  system
  3.8.6
* 3.9.0b5 (set by /home/ynon/.pyenv/version)

(כוכבית מסמן את הגירסה הנוכחית).

הפקודה global מאפשרת לעבור לסביבה אחרת באופן קבוע, והפקודה shell מאפשרת לעבור לסביבה אחרת באופן זמני רק ל shell הנוכחי. הנה דוגמה קטנה:

$ pyenv shell 3.8.6
$ python --version
Python 3.8.6

פייאנב מתקין את כל הקבצים שלו בתיקיית ~/.pyenv. בתוך תיקיה זו נמצאת תיקיית versions בה נמצאות כל הגירסאות שהוא התקין. בשביל להתקין גירסה חדשה משתמשים ב install:

$ pyenv install 3.9.0b5

ואם אתם עובדים עם IDE לדוגמה PyCharm אפשר פשוט לטעון כל אחת מגירסאות הפייתון שהותקנו לתוך ~/.pyenv/versions ל PyCharm כדי שגם הוא ידע לעבוד איתן.

2. יצירת סביבה לאוסף פרויקטים עם venv

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

בשביל לפתור את זה יש לנו קונספט נוסף להכיר שנקרא Virtual Environment. סביבה וירטואלית היא כמו התקנה נפרדת של פייתון אבל רק בשביל המודולים החיצוניים. כל פעם שאנחנו "נכנסים" לסביבה וירטואלית הכלים pip ו python יסתכלו על המודולים שמותקנים בתוך סביבה זו, וכשאנחנו יוצאים מהסביבה הוירטואלית הכלים יחזרו להסתכל על גירסת הפייתון הכללית.

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

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

python -m venv ~/python-venvs/helloworld

סביבה וירטואלית צריכה להישמר בתיקיה ושם התיקיה הוא הפרמטר שהעברתי ~/python-venv/helloworld. לאחר יצירת הסביבה אני נכנס אליה עם הפקודה:

$ source ~/python-venvs/helloworld/bin/activate

או בחלונות באמצעות הפקודה:

C:\MyPythonEnvs\helloworld\bin\activate.bat

כמובן שתצטרכו לעדכן את שם התיקיה שתתאים לתיקיה בה יצרתם את הסביבה הוירטואלית.

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

$ pip install pyglet

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

אחרי ההתקנה אני יכול לכתוב קובץ Python שמשתמש במודול pyglet ולהפעיל אותו:

$ python hellopyglet.py

וכשאני מסיים לעבוד בסביבה הוירטואלית אני יכול לצאת ממנה עם הפקודה deactivate.

3. העברת סביבה וירטואלית למכונה חדשה

אתגר אחרון שלנו הוא העברת סביבה וירטואלית מלאה למכונה חדשה, למשל בשביל להתקין על השרת את הסקריפט שלי או לשלוח אותו ללקוח. בשיטת העבודה שתיארתי מסתבר שזה אתגר קל מאוד. כל מה שצריך לעשות הוא למשוך את רשימת כל המודולים והגירסאות שלהם מסביבת העבודה לקובץ (נהוג לקרוא לו requirements.txt), ואז על המכונה החדשה להתקין את גירסת הפייתון המתאימה עם pyenv, ליצור סביבה וירטואלית ולהתקין לתוכה את כל תוכן הקובץ requirements.txt.

בשביל לקחת את כל המודולים מהסביבה הוירטואלית הנוכחית לתוך קובץ requirements.txt נשתמש בפקודה:

pip freeze > requirements.txt

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

$ pip install -r requirements.txt

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

ומה אתכם? יש לכם כלים אחרים או שיטות עבודה אחרות שעובדות עבורכם? אולי יותר טובות מאלה שאני תיארתי בפוסט? אם כן ספרו בתגובות ואשמח לשמוע ולנסות.