Kodax

Virtual Environments والحزم — Python المتقدم

البيئات الافتراضية وإدارة الحزم

عندما تستخدم مكتبات خارجية (requests، pandas، django) تظهر مشكلة: مشروع يحتاج requests 2.31 وآخر قديم يحتاج 2.20. لو ثبّتّ كل شيء على Python الخاصة بالنظام، ستتعارض المشاريع. البيئة الافتراضية مجلد فيه نسخة معزولة من Python وحزمها لكل مشروع.

إنشاء وتفعيل (في الطرفية، ليس داخل Python)

python -m venv .venv

# Windows (PowerShell)
.venv\Scripts\Activate.ps1
# Windows (cmd)
.venv\Scripts\activate.bat
# macOS / Linux
source .venv/bin/activate

deactivate

بعد التفعيل يظهر اسم البيئة في سطر الأوامر، وأي pip install يثبّت داخلها فقط.

pip

pip install requests            # أحدث إصدار
pip install "requests==2.31.0"  # إصدار محدد
pip install --upgrade requests
pip uninstall requests
pip list                        # الحزم المثبتة

استخدم python -m pip بدل pip إذا كان لديك أكثر من نسخة Python، لتضمن أنك تثبّت للنسخة الصحيحة.

تسجيل الاعتماديات

pip freeze > requirements.txt
pip install -r requirements.txt

requirements.txt يسمح لأي شخص (أو لخادم النشر) بإعادة إنشاء نفس البيئة. أضفه إلى git، أما مجلد .venv نفسه فأضفه إلى .gitignore: لا يُرفع أبداً.

pyproject.toml

المشاريع الحديثة تصف اسمها وإصدارها واعتمادياتها في ملف pyproject.toml (المعيار الحالي لحزم Python). أدوات مثل uv و poetry تدير البيئة والاعتماديات وملف قفل للإصدارات الدقيقة تلقائياً. فهمك لـ venv و pip هو الأساس الذي تقوم عليه كلها.

الأمان

- ثبّت الحزم من PyPI بأسمائها الصحيحة بدقة؛ توجد حزم خبيثة بأسماء قريبة من المشهورة (typosquatting).

- لا تستخدم sudo pip install على Linux/macOS.

- راجع الحزم قبل إضافتها: هل هي مستخدمة ومصانة؟

مشكلات شائعة

| المشكلة | السبب المعتاد |

|---|---|

| ModuleNotFoundError بعد التثبيت | البيئة غير مفعلة، أو ثبّتّ لنسخة Python أخرى |

| المحرر لا يرى الحزمة | اختر مفسّر .venv في إعدادات المحرر |

| PowerShell يرفض التفعيل | سياسة التنفيذ: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned |

تمرين

أنشئ مجلد مشروع جديداً، وبيئة افتراضية، وثبّت فيها requests، واكتب سكربتاً يطبع إصدارها (requests.__version__)، ثم أنشئ requirements.txt و .gitignore مناسباً.

# ===== إنشاء بيئة افتراضية =====
# في Terminal:
# python -m venv myenv

# تفعيل (Windows)
# myenv\Scripts\activate

# تفعيل (Linux/Mac)
# source myenv/bin/activate

# إلغاء التفعيل
# deactivate

# ===== إدارة الحزم =====
# تثبيت حزمة
# pip install requests

# تثبيت إصدار محدد
# pip install requests==2.28.0

# تثبيت من ملف
# pip install -r requirements.txt

# حفظ الحزم المثبتة
# pip freeze > requirements.txt

# ===== requirements.txt =====
"""
requests==2.28.0
pandas>=1.5.0
numpy~=1.24.0
python-dotenv
"""

# ===== Script للإعداد =====
import subprocess
import sys

def setup_project():
    """إعداد المشروع"""
    # تثبيت التبعيات
    subprocess.check_call([
        sys.executable, '-m', 'pip', 'install', '-r', 'requirements.txt'
    ])

# ===== pyproject.toml (الطريقة الحديثة) =====
"""
[project]
name = "myproject"
version = "1.0.0"
description = "وصف المشروع"
requires-python = ">=3.9"
dependencies = [
    "requests>=2.28.0",
    "pandas>=1.5.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.0.0",
    "black",
    "flake8",
]
"""

# ===== التحقق من البيئة =====
import sys
import pkg_resources

def check_environment():
    print(f"Python: {sys.version}")
    print(f"Path: {sys.executable}")
    print("\nالحزم المثبتة:")
    for pkg in pkg_resources.working_set:
        print(f"  {pkg.key}: {pkg.version}")

# ===== إدارة الإعدادات =====
from dotenv import load_dotenv
import os

# تحميل من .env
load_dotenv()

DATABASE_URL = os.getenv('DATABASE_URL', 'sqlite:///default.db')
API_KEY = os.getenv('API_KEY')
DEBUG = os.getenv('DEBUG', 'False').lower() == 'true'

# .env file:
# DATABASE_URL=postgresql://user:pass@localhost/db
# API_KEY=secret_key
# DEBUG=True

# ===== Poetry (الأفضل للمشاريع الكبيرة) =====
# تثبيت: pip install poetry
# إنشاء مشروع: poetry new myproject
# إضافة حزمة: poetry add requests
# تثبيت: poetry install
# تشغيل: poetry run python script.py
اختبر فهمك