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

מחבר:
בתאריך:

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

virtual environment venv in python tutorial מדריך לסביבה וירטואלית בפייתון

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

 

תחילת עבודה עם סביבה וירטואלית

מתוך הטרמינל מנווטים לתיקיית הפרויקט שבו רוצים ליצור את הסביבה הוירטואלית.

לדוגמה, ניצור תיקייה ששמה my_project:

$ mkdir my_project

ננווט לתוכה:

$ cd my_project/

ונקליד פקודה שמקימה סביבה וירטואלית ששמה venv:

$ python3 -m venv venv
  • לסביבה הוירטואלית אפשר לקרוא גם בשם אחר אבל מקובל לקרוא לה venv.

אחרי שיצרנו את הסביבה הוירטואלית נפעיל אותה:

$ source venv/bin/activate

ההפעלה תגרום להצגת שם הסביבה הוירטואלית בטרמינל:

(venv) $
  • עכשיו אנחנו פועלים בתוך הסביבה הוירטואלית.

נבדוק את גרסת הפייתון:

(venv) $ which python

התוצאה:

/my_project/venv/bin/python
  • זו לא ההתקנה הגלובלית של פייתון. הפייתון איתו הסביבה עובדת נמצא בתוך התיקייה.

 

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

כל הרעיון של סביבה וירטואלית הוא שנוכל לנהל בתוכה חבילות קוד. אז יאללה לעבודה.

אילו חבילות מותקנות בסביבה?

(venv) $ pip list

התוצאה:

Package Version
------------- -------
pip 20.1.1
pkg-resources 0.0.0
setuptools 44.0.0

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

לדוגמה, נתקין את flask:

(venv) $ pip install Flask

אילו חבילות מותקנות עכשיו בסביבה?

(venv) $ pip list

התוצאה:

Package Version
------------- -------
click 7.1.2
Flask 1.1.2
itsdangerous 1.1.0
Jinja2 2.11.3
MarkupSafe 1.1.1
pip 20.1.1
pkg-resources 0.0.0
setuptools 44.0.0
Werkzeug 1.0.1
  • הספרייה הותקנה עם כל התלוית שלה.

אפשר להתקין גרסה מסוימת של ספרייה. לדוגמה, גרסה 2.24.0 של requests:

(venv) $ python -m pip install requests==2.24.0

ואפשר לעדכן את אחת החבילות.

נעדכן את requests לגרסה החדישה ביותר:

(venv) $ python -m pip install --upgrade requests

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

 

ייצוא סביבת העבודה הוירטואלית

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

(venv) $ pip freeze > requirements.txt
  • בתוך הקובץ requirements.txt רשומות עכשיו גרסאות הספריות בהם הפרויקט תלוי בפורמט שהסביבה הוירטואלית יודעת לעבוד איתו.

נקים פרויקט נוסף כדי לייבא לתוכו את התלויות.

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

(venv) $ deactivate

ועכשיו כשאנחנו מחוץ לסביבה, ניצור תיקייה של פרויקט נוסף ששמו my_other_project:

$ mkdir my_other_project/

נכנס לתוך התיקייה:

$ cd my_other_project/

ניצור סביבה וירטואלית לה נקרא בהתאם לקונבנציה venv:

$ python3 -m venv venv

נפעיל את הסביבה:

$ source venv/bin/activate

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

(venv) $ python -m pip install -r requirements.txt
  • שימו לב לנתיב של requirement.txt 

אילו חבילות מותקנות?

(my_other_project_env) $ pip list

 

מחיקת סביבת העבודה

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

נצא מסביבת העבודה:

(venv) $ deactivate

ונמחוק את התיקייה:

$ rm -rf venv/

 

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

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

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

לכל המדריכים בסדרה ללימוד פייתון

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

הוסף תגובה חדשה

 

= 8 + 2