מבוא לסביבות פייתון למדעני נתונים

מאת איתמר כספי, 12 באפריל 2020

מדריך זה נכתב על ידי איתמר כספי כפוסט בקבוצת Machine & Deep learning Israel.

מבוא לסביבות פייתון למדעני נתונים

אמ;לק –

conda create -n my_project_env
conda activate my_project_env

[ you are now in a new python environment! ]

conda install necessary_packages_seperated_by_spaces

[ run tests on your script and make sure everything works! ]

python -m pip freeze > my_project_requirements.txt

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

לכבוד חג החירות והסגר החלטתי לעשות קצת סדר בסביבות הפייתון שלי.

בכל הלילות הייתה לי התקנת פייטון 3.6 של אנקונדה, שתי התקנות פייתון נוספות בחסות PyCharm, התקנה נפרדת וחופפת איפשהו של פייתון 2.7 והתקנה חדשה של פייתון 3.8.
הלילה הזה יש לי קונדה וכמה סביבות בתוכה.

מה זה סביבת פייטון וירטואלית?

סביבת פייטון היא בעצם שלושה דברים.
1. מפרש פייטון (Python Interperter)
2. חבילות פייטון נוספות שהורדת דרך פיפ או קונדה.
3. תיקייה עם כל מיני תוכנות שנכנסת לתוך הpath כשאתה בתוך הסביבה.
אז, לדוגמא, יכולה להיות לי סביבה אחת עם פייטון 3.7, pandas 1.0 וג'ופיטר וסביבה אחרת עם פייטון 2.7 וללא ג'ופיטר. שתיהן כמובן במקביל על אותו מחשב וניתן לעבור בניהן בפקודה קצרה בטרמינל.

למה צריך כמה סביבות פייתון שונות?

סקריפטים שונים מבוססים על גרסאות שונות של חבילות שונות.
ולמרות המאמצים העילאיים של קהילת הקוד הפתוח, מה שעובד תחת pandas 0.22 לאו דווקא יעבוד בpandas 1.0 למשל.
וכנ"ל לגבי כל חבילות הפייתון שלכם ואפילו פייתון עצמו.
מה שזה אומר זה שלמשל יכול להיות שתעדכנו מחר את פנדס ותקבלו באגים משונים ומציקים.
או שתנסו להריץ קוד של קולגה במחשב שלכם וזה לא ירוץ או, חלילה, ירוץ ותקבלו תוצאות שונות!
אז הרעיון בסביבות וירטואליות הוא שנדע להשתמש בקלות בדיוק(!) באותן גרסאות של חבילות.

קונדה, אנקונדה או מיניקונדה?

קונדה הוא מנהל סביבות וחבילות פייתון.
מיניקונדה זה סקריפט התקנה של מפרש פייתון + קונדה + מעט חבילות בסיסיות (כמו פיפ למשל). ~ 80MB
אנקונדה זה בעצם מפרש פייתון + קונדה + 1500 חבילות פייתון + ממ"ג (GUI) וכל מיני תוכנות ודברים. ~ 5GB
למשתמשים חדשים שעוד לא בחרו את הכלים שהם אוהבים להשתמש בהם כנראה שהכי נוח להשתמש באנקונדה.
מי שכבר יודע באיזה ספ"ם (IDE) הוא אוהב להשתמש, לא מפחד להוריד חבילה כשהוא צריך אותה, נהנה לדעת שהוא מחזיק ספריות מסודרות ויעילות ולא רוצה למלא את המחשב שלו בסתם שיט מיותר יעדיף להוריד מיניקונדה.

קונדה או פיפ?

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

conda install package_name
ואם החבילה לא קיימת אז להתקין באמצעות פיפ:
python -m pip install package_which_is_not_in_conda
המהדרין יבנו סביבה חדשה לפני שהם מתקינים דברים עם פיפ בשביל לוודא ששום דבר לא נשבר או מתנהג באופן לא צפוי.

איך מנהלים סביבות עם קונדה?

אז כפי שנרמז, בניגוד לפיפ שהוא כלי לניהול חבילות בלבד לקונדה יש יעוד נוסף והוא ניהול סביבות!
אז זה דיי מעצבן אם אתם טהרני קוד (פונקציה אחת, פעולה אחת!!!) אבל… גם מאוד נח.
אז בשביל ליצור סביבה חדשה של, נגיד, פייטון 2.7 נכתוב:
conda create -n my_new_env python=2.7
ואז בשביל לראות איזה סביבות יש לנו בקונדה נכתוב:
conda env list
שימו לב שיש כבר עוד סביבה שקוראים לה base והיא כנראה מכילה את הפייטון הכי עדכני שconda יודעת לעבוד איתו.
להפעיל את הסביבה החדשה:
conda activate my_new_env
ולהתקין את מה שאנחנו צריכים:
conda install necessary_packages_seperated_by_spaces
כשנרצה לוודא שנוכל לשחזר את המצב הנוכחי של הפרויקט נייצר קובץ שיתאר בדיוק את מצב הסביבה הנוכחי:
conda env export > env_requirements.yml
ובשביל לייצר סביבה חדשה שתהיה עותק של הסביבה ששמרנו:
conda env create -n restored_env -f env_requirements.yml

אז pip freeze או conda env export?

שתי הפקודות הנ"ל יוצרות רשימת שמכילה את כל החבילות בסביבה.
ההבדל הוא באיך אנחנו מתכוונים שישתמשו ברשימה הזאת.
אם אנחנו שומרים את הקובץ לעצמנו או שולחים למדען נתונים אחר כנראה שיהיה לנו יותר נוח לעבוד עם קונדה ולכן נעבוד כפי שצוין קודם.
אבל, לעיתים קרובות אנו מייצרים קבצי requirements בשביל חברינו התכנתים והם עלולים להתרעם (ובצדק) אם נצפה מהם להתקין קונדה בשביל להפעיל את הסקריפט שלנו.
אז בשבילם אנחנו יכולים להשתמש בפיפ:
python -m pip freeze > requirements.txt
ואת הקובץ הנ"ל לשים בתיקיית הפרויקט.
ובשביל לשכפל את הסביבה צריך ליצור סביבה חדשה (מה שהם כנראה יעשו עם כלי יותר פשוט וספציפי כמו למשל venv או virtualenv) ובתוכה:
python -m pip install -r requirements.txt

לבקשת הקהל – מה עם venv + pip ?
דיברנו פה מלא על קונדה אבל, לא הזכרתי כלל את הדרך הכי פייתונית ליצור סביבות – "הקמה" (10 נקודות לראשון שמגלה למה תרגמתי ככה venv).
הקמה היא הכלי הפשוט, המקובל ובמובנים רבים הנכון ביותר לנהל סביבות בפייתון.
ליצור סביבה חדשה:
python -m venv new_environment_path
ואז בשביל להפעיל אותה:
source new_environment_path
אז בהחלט כדאי וחשוב להכיר אבל, אני בכל זאת ממליץ על קונדה עבור מדעני נתונים כי עם הקמה נמצא עצמנו משתמשים בפיפ במקום קונדה וכאמור, קונדה מתיימרת לספק עוד הגנה מפני קונפליקטים בין החבילות הרלוונטיות לעולם מדע הנתונים ובעיני זו סיבה מספיק טובה להשתמש בה.

טיפים למטיבי לכת:
1. איך להוריד את שם הסביבה שמופיע משמאל לשם המשתמש בטרמינל:
conda config –set changeps1 False
ואז לאתחל את הטרמינל.
2. בPyCharm אתם צריכים להגדיר את הסביבה פעמיים(!) – פעם אחת בProject Interperter בשביל, למשל, syntax highlighting וחיפוש בתוך עורך הטקסט ופעם שנייה בRun Configurations בשביל להגדיר מאיזה סביבה הקובץ צריך לרוץ.
3. אובונטו (והפצות לינוקס אחרות) משתמש בפייטון 2.7 בשביל להריץ כל מיני דברים. כלומר, כשמשתמש העל (root) מקליד את הפקודה python צריך לעלות פייתון 2.7 אחרת, דברים מהותיים במערכת ההפעלה עלולים להישבר.
אל תריבו איתו!
תתקינו פייתון כמושצריך ובלי sudo או שתתכוננו לכמות נכבדת של כאב ראש.
4. כפי ש Or Zilberman לימד אותנו בתגובות, אם נקפיד להשתמש ב
python -m pip
במקום ב pip פשוט נוכל למנוע מפיפ סורר מסביבה אחרת לעשות לנו בלאגן.

וכרגיל אשמח לתיקונים, תגובות, שאלות, תהיות, רעיונות ותלונות!

הצטרפו לערוץ הטלגרם שלנו!

כל ההודעות שאתם לא רוצים לפספס

X