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