הבעיה שסביבות וירטואליות פותרות
התקינו Python, הריצו pip install requests, והחבילה נוחתת במקום גלובלי אחד. זה עובד מצוין לפרויקט אחד. בפרויקט השלישי זה מתחיל לכאוב:
- פרויקט A צריך
django==3.2. פרויקט B צריךdjango==5.0. רק לאחד מהם הגרסה שלו יכולה להיות מותקנת גלובלית. - אתם רוצים לנסות ספרייה חדשה, אבל לא רוצים שהיא תלכלך כל פרויקט אחר במחשב.
- חבר צוות משכפל את ה-repo שלכם ואין לו מושג באילו גרסאות של אילו חבילות הייתם תלויים בפועל.
סביבה וירטואלית היא הפתרון. זו תיקייה עצמאית שמחזיקה מפרש Python ותיקיית התקנה משלה לספריות. כשהסביבה מופעלת, python ו-pip בטרמינל מצביעים לתוך התיקייה הזו במקום ל-Python הכללי של המערכת. חבילות שמותקנות שם נשארות שם.
יצירת סביבה עם venv
venv מגיע עם Python 3, אין מה להתקין. מתוך תיקיית הפרויקט:
python3 -m venv .venv
זה יוצר תיקיית .venv/ ליד הקוד שלכם. השם .venv הוא מוסכמה כמעט אוניברסלית: הנקודה בהתחלה מסתירה אותה מרוב רשימות התיקיות, ועורכים כמו VS Code מזהים אותה אוטומטית.
אחרי שהפקודה מסתיימת, התיקייה מכילה התקנת Python מלאה (עשרות מגה-בייטים, וזה נורמלי) ו-pip משלה.
הפעלת הסביבה
ההפעלה משכתבת את ה-PATH של ה-shell שלכם כך ש-python ו-pip יפנו לאלה שבתוך .venv/. הפקודה תלויה בפלטפורמה:
# macOS / Linux
source .venv/bin/activate
# Windows (Command Prompt)
.venv\Scripts\activate.bat
# Windows (PowerShell)
.venv\Scripts\Activate.ps1
שורת הפקודה מקבלת קידומת (.venv) כל עוד הסביבה פעילה, תזכורת חזותית. כל pip install שתריצו עכשיו משפיע רק על הפרויקט הזה.
כשסיימתם להיום, deactivate מחזיר את המצב הקודם:
deactivate
לא צריך לבטל את ההפעלה לפני שסוגרים את הטרמינל: יציאה מה-shell היא אותו דבר.
התקנת חבילות
כשהסביבה פעילה, התקינו את מה שאתם צריכים:
pip install requests
pip install "pandas>=2.0"
pip install --upgrade requests
בדקו מה מותקן עם pip list. הסירו משהו עם pip uninstall requests.
החבילות המותקנות נמצאות תחת .venv/lib/pythonX.Y/site-packages/. אף פעם לא עורכים אותן ידנית: pip מנהל את התיקייה.
נעיצת תלויות עם requirements.txt
הפרויקט שלכם ניתן לשחזור רק אם אחרים יכולים להתקין את אותן גרסאות שבהן השתמשתם. הדרך הפשוטה ביותר לתעד את זה היא requirements.txt:
pip freeze > requirements.txt
pip freeze מדפיס כל חבילה מותקנת עם הגרסה המדויקת שלה. בצעו commit לקובץ ב-git.
כששותף (או אתם בעתיד על מחשב חדש) משכפל את ה-repo:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
שלוש פקודות, והסביבה שלו תואמת לשלכם.
הגדרת פרויקט נפוצה
כל תהליך העבודה, מההתחלה ועד הסוף:
# יצירת תיקיית הפרויקט
mkdir my_tool && cd my_tool
# יצירה והפעלה של ה-venv
python3 -m venv .venv
source .venv/bin/activate
# התקנת תלויות
pip install requests rich
# שמירה שלהן
pip freeze > requirements.txt
# עבודה על הקוד...
echo "import requests; print(requests.__version__)" > main.py
python main.py
# כשמסיימים
deactivate
הוסיפו את .venv ל-.gitignore
אף פעם אל תבצעו commit לתיקיית .venv/. היא תלויה בפלטפורמה וניתנת לשחזור מ-requirements.txt:
# .gitignore
.venv/
__pycache__/
*.pyc
commit שלה היה מנפח את ה-repo, נשבר במחשבים אחרים ומדליף את כל הקבצים הבינאריים הייחודיים למערכת ההפעלה שיש למפרש שלכם.
איזו גרסת Python?
כברירת מחדל, python3 -m venv .venv משתמש ב-python3 שה-shell שלכם מוצא. אם מותקנות אצלכם כמה גרסאות Python (נניח 3.12 ו-3.13), ציינו במפורש באיזו:
python3.13 -m venv .venv
ברגע שה-venv קיים, המפרש שלו נעוץ: הרצת python בתוך ה-venv המופעל תמיד משתמשת בגרסה הספציפית הזו, גם אם ה-Python של המערכת משתנה.
כשדברים משתבשים
כמה תסמינים נפוצים ותיקונים:
pip installעובד, אבל הייבוא שלי נכשל. התקנתם ל-Python הלא נכון. הפעילו את ה-venv לפניpip install, ובדקו שוב עםwhich python(macOS/Linux) אוwhere python(Windows).- "ModuleNotFoundError" אחרי ההפעלה. ה-venv נוצר בלי ספריות מסוימות, או שהחבילה הותקנה ל-venv אחר.
pip listמראה מה יש בפועל ב-venv הנוכחי. - סקריפט ההפעלה לא נמצא ב-Windows. PowerShell עשוי לחסום סקריפטים לא חתומים. הריצו פעם אחת
Set-ExecutionPolicy -Scope CurrentUser RemoteSignedכדי לאפשר סקריפטים מקומיים. - "No module named venv". בחלק מהפצות Linux, venv היא חבילה נפרדת.
sudo apt install python3-venvב-Debian/Ubuntu.
מעבר ל-venv: Poetry, uv, pipenv
כשתרגישו בנוח עם venv + pip + requirements.txt, תיתקלו בכלים שעוטפים את אותם רעיונות בנוחות רבה יותר:
- Poetry: מנהל venvs, תלויות ואריזה עם
pyproject.tomlיחיד. - uv: תחליף מהיר מאוד ל-
pip, שמטפל גם ב-venvs. - pipenv: כלי ותיק יותר שהפך את הדפוס "Pipfile + Pipfile.lock" לפופולרי.
כולם טובים. אף אחד מהם לא נדרש ללמידה. התרגלו קודם לתהליך העבודה הפשוט של venv, והשאר הם אופטימיזציות.
מה לקחת מכאן
- כל פרויקט Python אמיתי מקבל סביבה וירטואלית משלו.
- צרו אחת עם
python3 -m venv .venv, הפעילו אותה, ואז הריצוpip installבחופשיות. - נעצו תלויות עם
pip freeze > requirements.txtובצעו commit לקובץ. - אף פעם אל תבצעו commit לתיקיית
.venv/עצמה. - כשייבוא מתנהג מוזר, בדקו קודם איזה Python פעיל.
הצעד הבא: הדפוס __main__
אחרי שהגדרתם פרויקט והתקנתם חבילות, ביטוי אחרון סוגר את הפרק הזה: ה-guard if __name__ == "__main__". הוא נמצא כמעט בכל קובץ Python שנועד לרוץ כסקריפט, והוא הנושא של העמוד הבא.
שאלות נפוצות
מה זו סביבה וירטואלית ב-Python?
סביבה וירטואלית היא תיקייה עצמאית עם מפרש Python משלה ותיקיית site-packages משלה לספריות מותקנות. הפעלה שלה גורמת ל-python ול-pip להצביע לתוך התיקייה הזו במקום ל-Python של המערכת, כך שחבילות שמתקינים לא זולגות בין פרויקטים.
איך יוצרים סביבה וירטואלית ב-Python?
הריצו python3 -m venv .venv בתוך תיקיית הפרויקט. זה יוצר תיקיית .venv עם התקנת Python חדשה. הפעילו אותה עם source .venv/bin/activate ב-macOS/Linux או עם .venv\Scripts\activate ב-Windows. מעכשיו pip install משפיע רק על הפרויקט הזה.
האם כל פרויקט Python צריך סביבה וירטואלית?
לכל דבר שמעבר לסקריפט חד-פעמי, כן. היא מונעת התנגשויות גרסאות בין פרויקטים, הופכת את התלויות למפורשות בקובץ requirements.txt (או pyproject.toml), ומאפשרת לשותפים לשחזר את הסביבה שלכם. ההגדרה של דקה אחת חוסכת שעות של דיבאגינג של ModuleNotFoundError בהמשך.
מה ההבדל בין venv ל-virtualenv?
venv מובנה ב-Python 3, בלי צורך בהתקנה. virtualenv הוא כלי צד שלישי שקדם לו, עם כמה תכונות נוספות (יצירה מהירה יותר, תמיכה בגרסאות Python ישנות). ברוב הפרויקטים המודרניים venv היא ברירת המחדל הנכונה, ועברו ל-virtualenv רק אם יש לכם צורך מסוים.