البيئة والتنفيذ
درس 1 من 8
1البيئة والتنفيذ (Environment & First Programs)
الصورة الكبيرةالفرق بين الوضع التفاعلي وملف السكربت، ولماذا يأخذ كل مشروع بيئة افتراضية خاصة به بدل تلويث بايثون العام.
ماذا تشاهد في الرسم: سطر كود في ملف، يقرؤه مفسّر بايثون وينفّذه، فيظهر الناتج 5 على الشاشة.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
بايثون مثل مترجم يقف بينك وبين الحاسوب. تستطيع أن تحادثه سطرًا سطرًا فيرد فورًا، أو تكتب له رسالة كاملة في ملف فينفّذها مرة واحدة. والبيئة الافتراضية صندوق أدوات خاص بكل مشروع، حتى لا تختلط أدوات مشروع بأدوات مشروع آخر.
المفسّر python يعمل تفاعليًا REPL أو ينفّذ ملف سكربت python app.py. المتغير اسم يشير إلى قيمة، وprint يطبع، وf"..." يدمج القيم في النص. وpython -m venv .venv ينشئ بيئة معزولة تثبّت فيها الحزم بـpip دون أن تلمس بايثون النظام.
قبل أن تبدأ
🧭مسار الأدوات
تعرف الطرفية وتكتب أمرًا وتضغط Enter.
📄فكرة الملف
الكود ملف نصي عادي، اسمه ينتهي بـ.py.
الفكرة الجوهرية
لو هذه أول مرة تكتب فيها بايثون، ابدأ من هنا. ثلاث خطوات صغيرة، كل واحدة فيها كود تشغّله بنفسك قبل أن تقرأ عن البيئات والملفات.
1اطبع شيئًا
print تعني «اعرض على الشاشة». ما بين القوسين هو ما يُعرض. النص يُكتب بين علامتي تنصيص، والرقم يُكتب كما هو.
print("مرحبًا يا درب")
print(2 + 3)
print("2 + 3")
لاحظ الفرق بين السطرين الأخيرين: 2 + 3 بلا تنصيص حُسب فصار 5، وبالتنصيص بقي نصًّا كما كتبته.
2احفظ قيمة في اسم
المتغيّر اسم تضعه على قيمة لتستخدمها لاحقًا. تكتب الاسم، ثم علامة =، ثم القيمة. ولكل قيمة نوع: نص أو عدد صحيح أو عدد عشري.
name = "سارة" age = 21 height = 1.68 print(name) print(age + 1) print(type(name), type(age), type(height))
type تخبرك بنوع القيمة. str نص، وint عدد صحيح، وfloat عدد فيه فاصلة. ولاحظ أن age + 1 حُسب لأن age رقم.
3ادمج نصًّا وقيمة
لعرض جملة فيها قيمة متغيّر، اكتب حرف f قبل علامة التنصيص وضع اسم المتغيّر بين قوسين معقوفين. هذه هي الـf-string، وستستخدمها في كل برنامج تقريبًا.
name = "سارة"
age = 21
print(f"{name} عمرها {age} سنة")
print(f"بعد خمس سنوات: {age + 5}")
print("عدد الحروف في الاسم:", len(name))
داخل القوسين المعقوفين تستطيع أن تحسب أيضًا، كما في {age + 5}. وlen تعطيك طول النص بعدد حروفه.
print(nam) بدل print(name). بايثون سترد بـNameError، ومعناها الحرفي: لا أعرف اسمًا بهذا الشكل. اقرأ الرسالة، فهي تذكر الاسم الذي أخطأت فيه.كيف يعمل، خطوة بخطوة: ماذا يحدث عندما تكتب python hello.py
الشل يجد برنامج python ويشغّله، ويعطيه اسم ملفك.
المفسّر يقرأ الملف نصًّا ويتأكد أن كتابته سليمة.
ينفّذ الأسطر من الأعلى إلى الأسفل، سطرًا بعد سطر.
عند آخر سطر ينتهي البرنامج، وتعود لك الطرفية.
أعمق قليلًا
قبل كتابة أي منطق برمجي، تحتاج تفهم أين ومتى يُنفَّذ الكود. بايثون تدعم طريقتين للتنفيذ، ولكل منهما استخدام مختلف.
الوضع التفاعلي (REPL)
تكتب سطرًا وتضغط Enter فيُنفَّذ فورًا ويُطبع ناتجه تلقائيًا إن كان تعبيرًا (Expression). مثالي للتجربة السريعة، لكن لا يُحفظ بعد إغلاق الجلسة.
تنفيذ ملف Script
الكود يُنفَّذ من أول سطر للآخر دفعة واحدة. لا شيء يُطبع تلقائيًا، يجب استخدام print() صراحة. هذا هو الوضع القابل للمشاركة والتكرار.
pip والتوسعة
pip هو مدير الحزم، يثبّت أدوات مثل pycodestyle بأمر واحد. لكنه يثبّت الحزمة في البيئة النشطة حاليًا، سواء كانت عامة أو معزولة.
البيئات الافتراضية (venv)
مجلد يحتوي نسخة مستقلة من المفسّر ومكتباته الخاصة. تفعيله يُغيّر أي python3 يشير إليه نظامك مؤقتًا، هذا يمنع تعارض إصدارات المكتبات بين مشاريع مختلفة.
| المقارنة | REPL | Script |
|---|---|---|
| الطباعة التلقائية | نعم، لأي تعبير له قيمة | لا، تحتاج print() |
| الحفظ | لا يُحفظ | ملف دائم قابل للتشغيل المتكرر |
| الاستخدام النموذجي | تجربة وفحص سريع | برامج حقيقية وأتمتة |
مثال: لماذا تعزل البيئات؟
# بدون عزل: تثبيت مكتبة بإصدار جديد قد "يكسر" مشروعًا قديمًا يعتمد على إصدار قديم منها pip install requests==2.31 # يُثبَّت عالميًا لكل مشاريعك دفعة واحدة # مع venv: كل مشروع له نسخته الخاصة تمامًا python3 -m venv project_a_env python3 -m venv project_b_env source project_a_env/bin/activate pip install requests==2.31 # هذا الإصدار محصور في project_a_env فقط deactivate source project_b_env/bin/activate pip install requests==2.13 # لا يتعارض مع project_a_env إطلاقًا
اختبر فهمك: إذا فعّلت بيئة B ثم شغّلت which python3، ماذا تتوقع؟
مسارًا يشير داخل مجلد بيئة B (يحتوي B/bin/python3)، وليس مسار بايثون العام للنظام، هذا هو الدليل العملي على أن التفعيل يُغيّر أي مفسّر يُستخدَم فعليًا.
مثال محلول
requests دون أن تمسّ بايثون الجهاز. الجواب: python -m venv .venv ثم source .venv/bin/activate ثم pip install requests. كل ما ثبّتّه يعيش في مجلد .venv داخل المشروع، وتحذفه متى شئت دون أثر.خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| بايثون يحوّل الملف كله إلى برنامج قبل التشغيل مثل C. | بايثون يقرأ الملف وينفّذه مباشرة بمفسّر، ولهذا تشغّل ملفك دون خطوة تصريف منفصلة. |
| pip install يثبّت المكتبة لكل مشاريعي، وهذا جيد. | بدون بيئة افتراضية تتشارك المشاريع كلها نسخة واحدة، فيكسر تحديث مشروعًا آخر. البيئة الافتراضية تعزل كل مشروع. |
| الوضع التفاعلي يكفي للعمل الحقيقي. | ممتاز للتجربة السريعة، لكن ما تكتبه فيه يضيع عند الإغلاق. البرنامج الحقيقي ملف تحفظه وتعيد تشغيله. |
جرّب بنفسك
عندك count = "7" ثم كتبت print(count + 1). ماذا يحدث؟
القيمة "7" بين تنصيص فهي نص لا رقم، وبايثون ترفض جمع نص مع عدد وترد بـTypeError. إن أردت الحساب فحوّل أولًا: int(count) + 1 يعطي 8. وهذا الفرق بين النوعين هو أول ما يوقع المبتدئين.
بطاقات مراجعة سريعة
تحقق من فهمك
ما الفرق بين تشغيل python وحده وتشغيل python hello.py؟
الأول يفتح الوضع التفاعلي سطرًا بسطر، والثاني ينفّذ الملف كاملًا ثم ينتهي.
لماذا نعمل بيئة افتراضية لكل مشروع؟
حتى تكون مكتبات كل مشروع ونسخها منفصلة، فلا يكسر تحديث في مشروع مشروعًا آخر.
ماذا تطبع print("2 + 3")؟
تطبع النص 2 + 3 كما هو، لأن علامتي التنصيص تجعلانه نصًّا لا حسابًا.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
توثيق رسمي2
مقالات1
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.