انتقل إلى المحتوى الرئيسي

الوحدة 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

وعلى أيّ جهاز آخر — زميل، خادم، تكامل مستمرّ — تُعاد البيئة بأمرين:

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

النسخ المثبّتة بـ== تضمن التطابق التامّ: لن تحصل على pandas أحدث يغيّر سلوكاً بصمت. هذا بالضبط ما يحوّل «يعمل على جهازي» إلى «يعمل في كلّ مكان».

تفريق مقاصد ملفّي التبعيّات

من الجيّد التمييز بين ما تحتاجه أنت أثناء التطوير (requirements.in بقيود مرنة مقروءة) وما يُثبَّت فعلاً بنسخ دقيقة (requirements.txt المجمَّد). أدوات مثل pip-tools تولّد الثاني من الأول آلياً، فتجمع مقروئية النيّة ودقّة إعادة الإنتاج.

أدوات حديثة: uv وconda

venv + pip هو الأساس الذي يجب إتقانه، لكن يجدر معرفة البدائل: uv أداة حديثة سريعة جداً تجمع إنشاء البيئة والتثبيت في واجهة واحدة، وتنتشر بسرعة في مشاريع 2026. وconda شائعة في العلوم الحسابية لأنّها تدير أيضاً تبعيّات غير بايثونية (مكتبات C، CUDA للـGPU). المبدأ واحد في الجميع — العزل والتجميد — والأدوات تتغيّر.

الخلاصة

  • بيئة افتراضية لكلّ مشروع تحلّ تعارض النسخ جذرياً؛ ولا تثبّت شيئاً في بايثون العامّ.
  • python -m venv .venv ثم التفعيل؛ والمجلّد .venv يُستبعَد دائماً من Git.
  • pip install بقيود نسخ متّزنة؛ وpip list/pip show لمعرفة الحال الفعلي.
  • pip freeze > requirements.txt يجمّد النسخ الدقيقة؛ وpip install -r يعيد البيئة بأمانة على أيّ جهاز.
  • uv وconda بدائل حديثة بالمبدأ نفسه — العزل وإعادة الإنتاج.

الوحدة التالية: دفاتر Jupyter — البيئة المفضّلة للتحليل الاستكشافي، بمزاياها وفخاخها الخفيّة.