الوحدة 9 — البيئات الافتراضية وإدارة التبعيّات
«يعمل على جهازي» أشهر جملة في تاريخ البرمجيات، وأكثرها إحباطاً. تعالج هذه الوحدة سببها الجذري في بايثون: خلط تبعيّات المشاريع. والفكرة الحاكمة بسيطة — لكلّ مشروع بيئته المعزولة، وقائمة صريحة بما يحتاجه بالضبط.
المشكلة: تعارض النسخ
من دون عزل، تُثبَّت كلّ الحزم في مكان واحد مشترك على الجهاز. مشروع «أ» يحتاج pandas 1.5، ومشروع «ب» يحتاج pandas 2.1 لميزة جديدة. ترقية أحدهما تكسر الآخر في صمت. ومع تكاثر المشاريع يصير التثبيت العامّ متشابكاً لا يمكن التنبّؤ بحاله.
البيئة الا فتراضية تحلّ ذلك جذرياً: مجلّد معزول يحوي نسخة بايثون الخاصّة بالمشروع وحزمه وحدها. المشاريع لا ترى بعضها، والتعارضات تختفي بنيوياً.
venv: العزل بالأداة المدمجة
venv جزء من بايثون القياسي — لا شيء يُثبَّت:
python -m venv .venv # ينشئ البيئة في مجلّد .venv
# التفعيل
source .venv/bin/activate # على Linux / macOS
.venv\Scripts\activate # على Windows
# بعد التفعيل، اسم البيئة يظهر في الطرفية
(.venv) $ python --version
ما إن تُفعَّل البيئة، توجَّه كلّ أوامر python وpip إليها وحدها. وdeactivate تعيدك إلى النظام العامّ. اصطلاح مهمّ: يسمّى المجلّد .venv (بنقطة بادئة) ويُستبعَد دائماً من Git — إنه قابل لإعادة الإنشاء، فلا معنى لحفظه.
pip: تثبيت الحزم
pip install pandas numpy matplotlib seaborn # تثبيت
pip install "pandas>=2.0,<3.0" # تثبيت بقيد نسخة
pip list # ما هو مثبّت فعلاً
pip show pandas # تفاصيل حزمة وتبعيّاتها
قيود النسخ (>=2.0,<3.0) توازن بين الأمان والحداثة: تسمح بالتحديثات التصحيحية، وتمنع الترقية الكبرى التي قد تكسر السلوك. إنها التطبيق العملي لدرس الاستقرار في دورة المقدّمة.
requirements.txt: تجميد ما يحتاجه المشروع
الملفّ الذي يجعل المشروع قابلاً لإعادة الإنتاج على أيّ جهاز:
pip freeze > requirements.txt # يكتب كلّ الحزم بنسخها الدقيقة
يعطي ملفّاً كهذا:
numpy==1.26.4
pandas==2.1.4
matplotlib==3.8.2
seaborn==0.13.1