Kodokon kodokon.com

البيئات الافتراضية وpip ومشروع نظيف

اعزل كل مشروع في بيئته الافتراضية الخاصة، وثبّت إصدارات التبعيات، واعتمد بنية مشروع قابلة لإعادة الإنتاج.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

تثبيت تبعيات كل مشاريعك في المفسّر نفسه يقودك مباشرة إلى تعارض في الإصدارات: فالمشروع أ يحتاج requests 2.31، والمشروع ب يحتاج إصدارًا غير متوافق. أما البيئة الافتراضية (venv) فتعزل كل مشروع: مفسّره الخاص، وpip الخاص به، وحزمه. إنها الممارسة الاحترافية غير القابلة للتفاوض - مشروع واحد، وبيئة واحدة، يمكن إعادة إنشاؤها بشكل مطابق على أي جهاز.

BASH
python -m venv .venv
source .venv/bin/activate
# On Windows:
# .venv\Scripts\activate
python -m pip install requests
python -m pip list
إنشاء بيئة افتراضية وتفعيلها وملؤها

لجعل التثبيت قابلًا لإعادة الإنتاج، ثبّت الإصدارات. يصدّر pip freeze البيئة بأكملها، بما فيها التبعيات غير المباشرة، بإصداراتها الدقيقة: أقصى قدر من قابلية إعادة الإنتاج، وتحديثات شاقّة. أما المقاربة الحديثة فتفصل بين الحاجتين: التبعيات المباشرة مُصرَّح بها في pyproject.toml بقيود مرنة، وملف قفل يُولَّد من أجل التثبيت الدقيق. وعلى نطاق مشروع صغير، يبقى requirements.txt محترمًا تمامًا.

BASH
python -m pip freeze > requirements.txt
# On another machine:
python -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
تجميد الإصدارات ثم إعادة بناء البيئة بشكل مطابق

أما من ناحية البنية، فإن تخطيط src هو المرجع: الكود في src/<package>/، والاختبارات في tests/، والإعدادات في pyproject.toml. وفائدة المجلد src ليست تجميلية: فهو يمنع الاستيراد العرضي للحزمة المحلية من المجلد الحالي، وهو ما قد يُخفي أخطاء التحزيم - فاختباراتك تعمل على الحزمة المثبَّتة فعلًا. وأثناء التطوير، يثبّت pip install -e . المشروع في وضع التحرير.

BASH
mkdir -p src/billing tests
touch src/billing/__init__.py
touch src/billing/invoices.py
touch tests/test_invoices.py
touch pyproject.toml README.md .gitignore
echo ".venv/" >> .gitignore
هيكل مشروع بتخطيط src

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. ما الذي تضمنه البيئة الافتراضية؟
    • تنفيذًا أسرع لكود Python
    • تبعيات معزولة لكل مشروع
    • التوافق بين إصدارات Python
    • تشفير الحزم المثبَّتة
  2. ما الذي يحتويه ملف requirements.txt المُولَّد بواسطة pip freeze؟
    • تبعياتك المباشرة فقط
    • كل تبعية مثبَّتة، بإصداراتها الدقيقة
    • قائمة الحزم المتاحة على PyPI
  3. لماذا تفضّل python -m pip install على pip install؟
    • لأنها الصياغة الوحيدة المقبولة داخل بيئة افتراضية
    • لأن الأمر يستهدف pip الخاص بالمفسّر النشط
    • لأن التثبيت أسرع