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.txtrequirements.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اختبر فهمك