Python: البرمجة والأتمتة وتحليل البيانات
خروج

الدرس 1 من 14 · أساسيات اللغة

Python: التثبيت، المفسّر، السكربت الأول، venv وpip

45 د Python 3.12 (Debian, git, pip)

الهدف

إعداد بيئة عمل Python نظيفة: أن تعرف أيّ إصدار من Python مثبّت، وأن تتحاور مع المفسّر، وأن تكتب سكربتًا أول وتشغّله، ثم أن تمنح كل مشروع بيئته الافتراضية الخاصة لتثبيت المكتبات باستعمال pip دون إفساد النظام.

أهم النقاط

  • Python لغة مُفسَّرة (interpreted): لا حاجة إلى ترجمة (compilation)، نكتب ملف .py وننفّذه باستعمال python3 fichier.py.
  • يُستعمل المفسّر التفاعلي (python3 وحده، مع المحثّ >>>) لتجربة فكرة في بضع ثوانٍ.
  • على Linux استعمل python3؛ وعلى Windows استعمل المُشغِّل py. تحقّق دائمًا من الإصدار باستعمال python3 --version.
  • البيئة الافتراضية (python3 -m venv .venv) مجلد يحتوي على Python وحزم خاصة بمشروع واحد.
  • نثبّت الحزم باستعمال python -m pip install … داخل البيئة المفعّلة، وأبدًا ليس باستعمال sudo pip.

1. لماذا Python؟

يحظى Python بالتقدير لأنه يُقرأ تقريبًا مثل إنجليزية بسيطة، ولأنه يأتي مع مكتبة قياسية (standard library) غنية جدًا (الملفات، التواريخ، JSON، CSV، HTTP، الضغط، قواعد SQLite…). اللغة نفسها تخدم:

  • مدير الأنظمة الذي يستبدل سكربت shell من 300 سطر بـ 60 سطرًا مقروءًا؛
  • المطوّر الذي يكتب API ويب لتطبيق توصيل في الدار البيضاء؛
  • المحلّل الذي يحوّل كل شهر ملف Excel لمبيعات تعاونية إلى تقرير واضح.

تدين اللغة باسمها للفكاهيين الإنجليز Monty Python، وليس للثعبان. والدرس الرسمي يشير إلى ذلك باستمرار على سبيل الدعابة.

2. تثبيت Python

على Linux

توفّر معظم التوزيعات Python 3 مسبقًا: فكثير من أدوات النظام تعتمد عليه. تحقّق:

python3 --version          # مثال: Python 3.12.3
which python3              # /usr/bin/python3

إذا كان غير موجود، فثبّته باستعمال مدير الحزم الخاص بتوزيعتك، مع وحدة البيئات الافتراضية:

# Debian / Ubuntu
sudo apt install python3 python3-venv python3-pip

# Rocky / Alma / RHEL
sudo dnf install python3 python3-pip

لا تحذف أبدًا Python الخاص بالنظام، ولا تستبدل /usr/bin/python3 بإصدار آخر: فأدوات مثل dnf وapt وfirewalld تعتمد عليه.

على Windows

ثبّت Python من الموقع الرسمي (python.org) أو من Microsoft Store. الأمر الذي يجب تذكّره هو المُشغِّل py:

py --version
py -3.12 script.py         # اختيار إصدار محدّد إذا كانت عدة إصدارات مثبّتة

أثناء التثبيت من python.org، فعّل الخيار الذي يضيف Python إلى PATH.

أيّ إصدار؟

استعمل إصدارًا 3.x حديثًا ومُصانًا (3.12 في تماريننا). انتهى Python 2 منذ 2020: إذا كتب درس قديم print "bonjour" دون أقواس، فهو يعود إلى تلك الحقبة.

3. المفسّر التفاعلي

اكتب python3 دون وسيط (argument):

$ python3
Python 3.12.3 (main, …) [GCC …] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 + 3
5
>>> 1500 * 1.20          # السعر مع الضريبة لسلعة بـ 1 500 درهم دون ضريبة
1800.0
>>> "Rabat".upper()
'RABAT'
>>> help(len)            # المساعدة المدمجة؛ المفتاح q للخروج
  • >>> هو المحثّ الرئيسي، و... يظهر عندما تمتدّ تعليمة على عدة أسطر (بعد if أو for)؛
  • في الوضع التفاعلي تُعرض قيمة التعبير تلقائيًا؛ أما في السكربت فيلزم print()؛
  • للخروج: Ctrl-D على Linux، وCtrl-Z ثم Entrée على Windows، أو quit().

هناك طريقتان أخريان لتشغيل المفسّر مفيدتان جدًا في إدارة الأنظمة:

python3 -c 'print(19 * 1.2)'        # تنفيذ تعليمة صغيرة
python3 -m http.server 8000         # تشغيل وحدة من المكتبة كبرنامج
python3 -i script.py                # تنفيذ السكربت ثم البقاء في الوضع التفاعلي

4. السكربت الأول

السكربت ملف نصي بسيط بترميز UTF-8 وامتداد .py. أنشئ facture.py:

# facture.py — حساب فاتورة بسيطة
print("Coopérative Tifaout — facture")
prix_ht = 250
print("Prix TTC :", prix_ht * 1.20, "DH")

شغّله:

python3 facture.py
# Coopérative Tifaout — facture
# Prix TTC : 300.0 DH

ملاحظات:

  • الرمز # يبدأ تعليقًا (comment) يتجاهله Python؛
  • يقرأ Python الملف من الأعلى إلى الأسفل وينفّذ كل سطر بالترتيب؛
  • الإزاحة (indentation) مهمّة: يجب ألّا يبدأ سطر بمسافات دون سبب (سترى السبب مع الشروط). اضبط محرّرك على 4 مسافات، ولا تخلط أبدًا مع علامات الجدولة (tabs).

استقبال الوسائط

تتيح الوحدة sys الوصول إلى وسائط سطر الأوامر:

# salut.py
import sys
print("Bonjour", sys.argv[1])
python3 salut.py Youssef      # Bonjour Youssef

sys.argv[0] هو اسم السكربت، وsys.argv[1] هو الوسيط الأول، وهكذا (الدرس 3.1: الوحدة argparse تقوم بذلك بشكل أنظف).

5. جعل السكربت قابلًا للتنفيذ

على Linux يمكن تشغيل سكربت كأمر عادي دون كتابة python3 قبله. يلزم أمران:

  1. سطر أول shebang يحدّد المفسّر؛
  2. صلاحية التنفيذ.
#!/usr/bin/env python3
print("Sauvegarde du serveur web…")
chmod +x sauvegarde.py
./sauvegarde.py

يبحث #!/usr/bin/env python3 عن python3 في PATH: وهذا أكثر قابلية للنقل من #!/usr/bin/python3، ويحترم البيئة الافتراضية المفعّلة. انتبه: يجب أن يحتوي الملف على نهايات أسطر Unix (LF)؛ فالملف المحفوظ على Windows (CRLF) يسبّب الخطأ /usr/bin/env: 'python3\r': No such file or directory.

6. البيئات الافتراضية

المشكلة

يستعمل موقع الحجز الخاص برياض الإصدار 1 من مكتبة ما؛ أما أداة الفوترة، على الخادم نفسه، فتتطلّب الإصدار 2. مع تثبيت واحد لـ Python، سيتعطّل أحدهما. كما أن تثبيت الحزم في Python الخاص بالنظام قد يُفسد أدوات التوزيعة.

الحل: مجلد لكل مشروع

cd ~/projets/facturation
python3 -m venv .venv            # ينشئ المجلد .venv
source .venv/bin/activate        # Linux / macOS
# .venv\Scripts\activate         # Windows
(.venv) $ which python
/home/sara/projets/facturation/.venv/bin/python
(.venv) $ deactivate             # العودة إلى Python الخاص بالنظام
  • ينسخ venv (أو يربط) المفسّر الذي شغّلته به: python3.12 -m venv .venv يعطي بيئة 3.12؛
  • الاسم .venv هو العُرف المتّبع: مخفيّ، وواضح، ولا يختلط بملف إعدادات .env؛
  • تفعيل البيئة لا يغيّر إلا الـ shell الحالي (PATH والمحثّ)؛
  • دون تفعيل، يمكن استدعاء .venv/bin/python script.py مباشرة: وهذا ما نفعله في مهمة cron أو في وحدة systemd؛
  • المجلد .venv لا يُنسخ من جهاز إلى آخر ولا يوضع أبدًا في Git (أضفه إلى .gitignore).

لمعرفة ما إذا كنا داخل بيئة افتراضية، انطلاقًا من Python:

import sys
print(sys.prefix)          # مجلد البيئة
print(sys.base_prefix)     # Python الأصلي؛ يختلف عن sys.prefix داخل venv

7. تثبيت الحزم باستعمال pip

يقوم pip بتنزيل الحزم من PyPI (Python Package Index). استعمل الصيغة python -m pip: هكذا تضمن أنك تستعمل pip الخاص بـ Python النشط.

(.venv) $ python -m pip install requests              # آخر إصدار
(.venv) $ python -m pip install "requests==2.32.3"    # إصدار محدّد
(.venv) $ python -m pip install --upgrade requests    # التحديث
(.venv) $ python -m pip list                          # الحزم المثبّتة
(.venv) $ python -m pip show requests                 # تفاصيل حزمة
(.venv) $ python -m pip uninstall requests

requirements.txt

لكي يحصل زميل (أو خادم الإنتاج) على الإصدارات نفسها بالضبط:

(.venv) $ python -m pip freeze > requirements.txt     # تثبيت الإصدارات
(.venv) $ cat requirements.txt
certifi==2024.8.30
requests==2.32.3
…
# على الجهاز الآخر:
(.venv) $ python -m pip install -r requirements.txt

الملف requirements.txt يوضع في Git، أما المجلد .venv فلا.

الخطأ «externally-managed-environment»

على Debian 12 وUbuntu 23.04 والإصدارات الأحدث، يُرفض pip install خارج البيئة الافتراضية مع الرسالة externally-managed-environment. ليس هذا خللًا: فالتوزيعة تحمي Python الخاص بها. الجواب الصحيح هو إنشاء venv، وليس إضافة --break-system-packages.

8. محرّر النصوص

أيّ محرّر نصوص يكفي، لكن محرّرًا يفهم Python سيوفّر عليك وقتًا كثيرًا: تلوين الشيفرة، والإزاحة التلقائية بـ 4 مسافات، واكتشاف الأخطاء. VS Code (مع امتداد Python) وPyCharm Community مجانيان. وعلى الخادم، يكفي vim أو nano للسكربتات الصغيرة.

أخطاء متكررة

  • python مقابل python3: في كثير من توزيعات Linux، python غير موجود أو يشير إلى شيء آخر. اكتب python3 (أو python فقط داخل venv مفعّل).
  • التثبيت باستعمال sudo pip install: أنت تعدّل Python الخاص بالنظام وقد تُفسد بعض الأدوات. استعمل دائمًا venv.
  • نسيان تفعيل الـ venv: تُثبَّت الحزمة في مكان آخر ويفشل import requests مع ModuleNotFoundError. تحقّق باستعمال which python.
  • خلط علامات الجدولة والمسافات: الخطأ TabError أو IndentationError. 4 مسافات في كل مكان.

التطبيق العملي (Lab)

يعمل تمرينك على جهاز فيه Python 3.12 ومكتبته القياسية، دون اتصال بالإنترنت (إذن لا يمكن تنفيذ pip install لحزمة بعيدة). ستقوم بما يلي:

  1. كتابة /root/bonjour.py، سكربتك الأول؛
  2. جعله قابلًا للتنفيذ باستعمال shebang وchmod +x؛
  3. كتابة /root/version.py الذي يقرأ الإصدار عبر sys.version_info؛
  4. إنشاء البيئة الافتراضية /root/projet/.venv؛
  5. إثبات أنك تستعمل فعلًا pip الخاص بهذه البيئة.

لكتابة ملف دون محرّر:

cat > /root/bonjour.py <<'EOF'
print("Marhaba, MasterLinux !")
EOF

اختبار قصير

  1. ما الأمر الذي يشغّل المفسّر التفاعلي على Linux؟ وعلى Windows؟
  2. ماذا يفعل السطر #!/usr/bin/env python3 في أعلى السكربت؟
  3. لماذا ننشئ بيئة افتراضية لكل مشروع؟
  4. لماذا نكتب python -m pip install بدلًا من pip install؟
  5. ما الملف الذي يسمح بإعادة تثبيت الإصدارات نفسها بالضبط من الحزم على خادم آخر، وما المجلد الذي يجب ألّا يوضع أبدًا في Git؟
الأجوبة
  1. python3 على Linux؛ وpy (المُشغِّل) على Windows.
  2. إنه الـ shebang: عندما يُشغَّل السكربت مباشرة (./script.py، مع صلاحية التنفيذ)، يستعمل النظام python3 الموجود في PATH لتنفيذه.
  3. لكي تكون لكل مشروع إصداراته الخاصة من المكتبات، دون تعارض بين المشاريع ودون المساس بـ Python الخاص بالنظام.
  4. لأن python -m pip يستعمل بالتأكيد pip الخاص بالمفسّر النشط (مفسّر الـ venv)، بينما قد يشير الأمر pip إلى Python آخر.
  5. requirements.txt (الذي ينتجه python -m pip freeze)؛ والمجلد .venv لا يوضع أبدًا في Git.

المراجع: الدرس الرسمي لـ Python بالفرنسية (رخصة PSF). نص أصلي من MasterLinux.

تمارين تطبيقية

تُنجَز على Python 3.12 (Debian, git, pip)

الطرفية عبر الإنترنت قادمة قريبًا. في انتظار ذلك، أنجِز هذه المهام على جهازك بنظام لينكس أو على آلة افتراضية أو WSL.

  1. أنشئ السكربت /root/bonjour.py الذي يعرض بالضبط: Marhaba, MasterLinux !
    عرض تلميحيكفي سطر واحد: print("Marhaba, MasterLinux !"). اكتبه باستعمال echo أو cat > /root/bonjour.py <<'EOF'.
    عرض الحل
    printf '%s\n' 'print("Marhaba, MasterLinux !")' > /root/bonjour.py

    التحقق : test -f /root/bonjour.py && test "$(python3 /root/bonjour.py)" = "Marhaba, MasterLinux !"

  2. اجعل هذا السكربت قابلًا للتنفيذ مباشرة: يجب أن يعرض الأمر /root/bonjour.py (دون كتابة python3 قبله) الرسالة نفسها. تحتاج إلى سطر shebang وإلى صلاحية التنفيذ.
    عرض تلميحالسطر الأول: #!/usr/bin/env python3 — ثم chmod +x /root/bonjour.py.
    عرض الحل
    printf '%s\n' '#!/usr/bin/env python3' 'print("Marhaba, MasterLinux !")' > /root/bonjour.py && chmod +x /root/bonjour.py

    التحقق : test -x /root/bonjour.py && head -n 1 /root/bonjour.py | grep -q "^#!.*python3" && test "$(/root/bonjour.py)" = "Marhaba, MasterLinux !"

  3. أنشئ /root/version.py الذي يعرض إصدار المفسّر على الشكل «Python 3.12» (الرقم الرئيسي.الثانوي فقط)، بقراءة sys.version_info: يجب أن تبقى النتيجة صحيحة إذا تغيّر المفسّر.
    عرض تلميحimport sys ثم print(f"Python {sys.version_info.major}.{sys.version_info.minor}") — لا تكتب 3.12 بشكل ثابت.
    عرض الحل
    printf '%s\n' 'import sys' 'print(f"Python {sys.version_info.major}.{sys.version_info.minor}")' > /root/version.py

    التحقق : test -f /root/version.py && ! grep -q "3\.12" /root/version.py && test "$(python3 /root/version.py)" = "$(python3 -c 'import sys; print("Python %d.%d" % sys.version_info[:2])')"

  4. أنشئ بيئة افتراضية في /root/projet/.venv (المجلد /root/projet غير موجود بعد).
    عرض تلميحmkdir -p /root/projet ثم python3 -m venv /root/projet/.venv
    عرض الحل
    mkdir -p /root/projet && python3 -m venv /root/projet/.venv

    التحقق : test -x /root/projet/.venv/bin/python && /root/projet/.venv/bin/python -c 'import sys; sys.exit(0 if sys.prefix != sys.base_prefix else 1)'

  5. احفظ في /root/projet/pip.txt خرج الأمر «pip --version» الخاص بالبيئة الافتراضية (وليس الخاص بالنظام): يجب أن يظهر فيه المسار /root/projet/.venv.
    عرض تلميح/root/projet/.venv/bin/python -m pip --version > /root/projet/pip.txt (أو فعّل البيئة أولًا باستعمال source).
    عرض الحل
    /root/projet/.venv/bin/python -m pip --version > /root/projet/pip.txt

    التحقق : test -f /root/projet/pip.txt && grep -q "^pip " /root/projet/pip.txt && grep -q "/root/projet/.venv" /root/projet/pip.txt

المراجع الرسمية المعتمدة: Mise en bouche — https://docs.python.org/fr/3/tutorial/appetite.html ; Mode d'emploi de l'interpréteur Python — https://docs.python.org/fr/3/tutorial/interpreter.html ; Environnements virtuels et paquets — https://docs.python.org/fr/3/tutorial/venv.html ; Annexe (mode interactif, scripts exécutables) — https://docs.python.org/fr/3/tutorial/appendix.html. نص أصلي من MasterLinux.