كيفية تنقيح شيفرات بايثون من سطر الأوامر التفاعلي
يعد تنقيح الشيفرات البرمجية (Debugging) جزءًا أساسيًا من عملية تطوير البرمجيات، حيث يساعد المطورين على تحديد الأخطاء وتصحيحها بشكل منهجي. في لغة بايثون، يوفر سطر الأوامر التفاعلي (Interactive Command Line) العديد من الأدوات والطرق التي يمكن استخدامها لتنقيح الشيفرات بسهولة وكفاءة. في هذا المقال، سوف نستعرض كيفية تنقيح شيفرات بايثون باستخدام سطر الأوامر التفاعلي، مع التركيز على الأدوات المتاحة والخطوات التي يمكن اتباعها للحصول على نتائج دقيقة وسريعة.
1. مقدمة إلى سطر الأوامر التفاعلي في بايثون
سطر الأوامر التفاعلي في بايثون هو بيئة تفاعلية تُستخدم لتنفيذ الأوامر البرمجية بشكل فوري، مما يسهل تجربة الأكواد واختبارها في الوقت الفعلي. عند استخدام سطر الأوامر التفاعلي (الذي يُعرف أحيانًا بموجه بايثون)، يمكن للمطورين كتابة وتنفيذ الأوامر البرمجية مباشرة دون الحاجة إلى حفظها في ملف منفصل، ما يوفر الكثير من الوقت عند اختبار أجزاء معينة من الشيفرة أو البحث عن الأخطاء.
يمكن الوصول إلى سطر الأوامر التفاعلي بكتابة الأمر python أو python3 في الطرفية (Terminal) على أنظمة تشغيل مثل ويندوز أو لينكس أو macOS.
2. تنقيح شيفرة بايثون باستخدام الأمر pdb
أحد الأدوات الأكثر شيوعًا في بايثون لتنقيح الشيفرة هو pdb (Python Debugger)، وهو مكتبة مدمجة في بايثون توفر واجهة تفاعلية لتتبع وتنقيح الأخطاء في الكود. يمكن استخدام pdb في سطر الأوامر التفاعلي لوقف تنفيذ البرنامج عند نقاط معينة، مما يسمح للمطور بفحص المتغيرات وتحديد ما إذا كانت القيم التي يتم تخزينها صحيحة أم لا.
2.1 كيفية استخدام pdb في سطر الأوامر التفاعلي
لاستدعاء pdb في سطر الأوامر التفاعلي، يمكن ببساطة استيراد المكتبة واستخدام الأمر set_trace() لبدء عملية التنقيح عند نقطة معينة في الشيفرة. على سبيل المثال، إذا كنت تعمل على ملف بايثون اسمه example.py، يمكن إضافة السطر التالي في أي مكان من الشيفرة لتفعيل التنقيح:
pythonimport pdb; pdb.set_trace()
عند تنفيذ الشيفرة، سيتوقف البرنامج عند هذا السطر ويبدأ سطر الأوامر التفاعلي. ستظهر لك موجهات pdb داخل بيئة بايثون، حيث يمكنك إدخال أوامر لمتابعة أو فحص حالة المتغيرات.
2.2 أوامر التنقيح باستخدام pdb
-
n(next): تنفيذ السطر التالي من الشيفرة دون الدخول إلى أي دوال أو وظائف داخلية. -
s(step): الدخول في الدالة أو الوظيفة التي يتم استدعاؤها في السطر الحالي. -
c(continue): استئناف تنفيذ البرنامج حتى تصل إلى نقطة توقف أخرى. -
p(print): طباعة قيمة المتغير. مثال:p xلعرض قيمة المتغيرx. -
q(quit): الخروج من وضع التنقيح وإنهاء البرنامج.
3. استخدام trace لعرض تتبع الشيفرة
مكتبة trace هي أداة أخرى مدمجة في بايثون تساعد على تتبع تنفيذ الشيفرة. يمكن استخدامها لمعرفة أي الأسطر تم تنفيذها أثناء تشغيل البرنامج، وهو ما يعد مفيدًا عندما لا تكون متأكدًا من الأماكن التي يمر من خلالها البرنامج.
3.1 كيفية استخدام trace
لإظهار تتبع الشيفرة في سطر الأوامر التفاعلي، يمكن تشغيل الأمر التالي:
bashpython -m trace --trace example.py
سيقوم هذا الأمر بتشغيل الشيفرة وإظهار كل سطر يتم تنفيذه أثناء عملية التشغيل، مما يساعد في تحديد المواضع التي قد تحدث فيها الأخطاء.
4. التحقق من القيم باستخدام dir() و locals() و globals()
أداة أخرى مفيدة في عملية التنقيح هي استخدام دوال dir() و locals() و globals() لفحص بيئة العمل الحالية. هذه الأدوات تسمح للمطورين بفحص المتغيرات المتاحة والقيم التي تحتويها.
-
dir(): تعرض قائمة بجميع الأسماء في النطاق المحلي أو العالمي. -
locals(): تعرض القيم الحالية لجميع المتغيرات في النطاق المحلي. -
globals(): تعرض القيم الحالية لجميع المتغيرات في النطاق العالمي.
على سبيل المثال، في سطر الأوامر التفاعلي، يمكن للمطور استخدام الدالة locals() لعرض كافة المتغيرات المتاحة في النطاق الحالي وفحص قيمها:
pythonlocals()
5. الاستفادة من الاستثناءات (Exceptions) في التنقيح
عند التعامل مع الأخطاء في بايثون، يمكن للمطورين استخدام الاستثناءات (Exceptions) لاكتشاف الأخطاء بسهولة أكبر. عند حدوث استثناء، يتم توفير رسالة خطأ تحتوي على تفاصيل مهمة مثل نوع الاستثناء وموقع حدوثه.
لإظهار استثناءات بشكل أكثر وضوحًا أثناء التنقيح، يمكن استخدام الأمر try-except حول الجزء المشتبه فيه من الشيفرة. على سبيل المثال:
pythontry:
result = 10 / 0
except ZeroDivisionError as e:
print(f"خطأ: {e}")
في حالة حدوث الخطأ، سيتم طباعة رسالة مخصصة توضح سبب المشكلة.
6. استخدام الأدوات الخارجية مثل IPython و pdb++
لتحسين تجربة التنقيح في بايثون، يمكن للمطورين استخدام أدوات خارجية مثل IPython و pdb++. هذه الأدوات توفر بيئة أكثر مرونة وقوة للتنقيح مقارنة بالبيئة الافتراضية في بايثون.
-
IPython: هو واجهة تفاعلية متقدمة لبايثون، وتوفر ميزات مثل التكميل التلقائي للأوامر، وعرض التاريخ الكامل للأوامر، والتنقيح المتقدم. -
pdb++: هو امتداد مكتبةpdbيوفر واجهة مستخدم أفضل وأوامر إضافية تجعل عملية التنقيح أكثر سهولة.
لتثبيت هذه الأدوات، يمكن استخدام الأمر:
bashpip install ipython pdb++
ثم، لاستخدام pdb++ في سطر الأوامر التفاعلي، يمكن استيراد المكتبة كالتالي:
pythonimport pdb; pdb.set_trace()
7. التنقيح التفاعلي باستخدام بيئات التطوير المتكاملة (IDE)
بالإضافة إلى الأدوات المذكورة سابقًا، توجد بيئات تطوير متكاملة (IDE) مثل PyCharm و VSCode التي توفر أدوات تنقيح متقدمة، ولكن استخدام سطر الأوامر التفاعلي يظل خيارًا ممتازًا للمطورين الذين يفضلون العمل في بيئة نصية.
تدعم هذه البيئات عادة أدوات التنقيح المتكاملة التي تسمح بإيقاف البرنامج عند نقاط توقف محددة، ومراقبة المتغيرات، وتحديد الأخطاء بسهولة.
8. التنقيح في بيئات متعددة الخيوط (Multithreading)
في بعض الأحيان، قد يكون لديك شيفرة تستخدم تعدد الخيوط (Multithreading) في بايثون، وهو ما قد يصعب التنقيح نظرًا لأن هناك عدة خيوط تعمل في وقت واحد. لكن يمكن استخدام أدوات مثل pdb و trace في بيئات متعددة الخيوط لتنقيح البرنامج وتحديد الأماكن التي قد تحدث فيها مشكلات متعلقة بالخيوط.
يمكنك أيضًا استخدام مكتبات مثل threading و multiprocessing لتقسيم الشيفرة بشكل أفضل وتنظيم التنقيح عندما تعمل مع برامج متعددة الخيوط.
9. أفضل الممارسات في تنقيح الشيفرة
-
استخدام نقاط التوقف (Breakpoints): حدد نقاط التوقف في الشيفرة في الأماكن التي تشك في وجود خطأ فيها. يمكن استخدام
pdb.set_trace()لوقف التنفيذ. -
اختبار الوحدات (Unit Testing): استخدم اختبارات الوحدة للتأكد من أن الشيفرة تعمل كما هو متوقع.
-
التنقيح التدريجي: ابدأ بتنقيح أجزاء صغيرة من الشيفرة لتحديد السبب الجذري للأخطاء.
-
التوثيق الجيد للأخطاء: قم بتوثيق الأخطاء ورسائل الاستثناء بشكل جيد حتى يسهل تتبعها في المستقبل.
10. خاتمة
يعد تنقيح شيفرات بايثون من سطر الأوامر التفاعلي مهارة حيوية لكل مطور بايثون. باستخدام الأدوات مثل pdb و trace، يمكن للمطورين تحديد الأخطاء بسرعة وفحص القيم أثناء تشغيل البرنامج. كما أن استخدام أدوات خارجية مثل IPython و pdb++ قد يوفر

