الوضع التفاعلي

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

التعامل مع الأخطاء

يطبَع المُفسِر - مُفسِر بايثون - رسالة خطأ ورصة تتبُّع (stack trace) عند حدوث خطأ ما. يرجع بعدها المُفسِر، في الوضع التفاعلي، إلى المُحِث الرئيسي (primary prompt)، وذلك نقيض ما يَحدُث عندما يُشغِّل المُفسِر ملفًا؛ حيث يوقِف المُفسِر التشغيل ويخرج برمز خروج غير مُصفَّر (nonzero exit status) بعد طباعته لرصة التتبُّع (لاحظ أنَّ الأخطاء الناتجة عن الشيفرات المحصورة بالعبارة try … except مُستثناة من سياقنا). بعض الأخطاء غير فادحة (fatal) ولكنها تسبب الخروج برمز خروج غير مُصفَّر (مثل الأخطاء الناتجة عن عدم تناسيق داخلي، والأخطاء الناتجة عن نفاذ الذاكرة). تُرسَل جميع رسائل الأخطاء إلى مجرى الأخطاء القياسي (standard error steam)، بينما تُرسَل المُخرجات العادية الناتجة عن تنفيذ الشيفرات إلى مجرى الخرج القياسي (standard output). يؤدي ضغط أحد مفاتيح المُقاطعة (interrupt character) (عادةً Control-C أو Delete)، في المُحث الرئيسي أو الثانوي (secondary prompt)، إلى إلغاء المُدخَل والرجوع إلى المُحث الرئيسي. بينما يؤدي ضغط أحد مفاتيح المُقاطعة أثناء تنفيذ أمر (أو مجموعة أوامر) إلى إطلاق الاستثناء KeyboardInterrupt (يُمكِن التعامل مع ذلك باستخدام العبارة try … except).

جعل البرمجيات تنفيذيّة

يمكن جعل برمجيات بايثون، في الأنظمة الشبيهة بيونكس، تنفيذيّة (executable) عبر إضافة السطر:

‎‎#!/usr/bin/env python3.5

في بداية شيفرة البرمجيّة (على افتراض أنَّ مسار المُفسِر موجود في متغيّر البيئة PATH)، وإعطاءها صلاحيات التنفيذ بعد ذلك. ينبغي أن يوضَع المحرفين(!#‎‎) في بداية الملف حصرًا. في بعض الأنظمة، ينبغي أن ينتهي هذا السطر بِمحرَف السطر الجديد الخاص بأنظمة يونكس ('‎‎'\n)، وليس الخاص بنظام ويندوز ('‎‎\r\n'). لاحظ أنَّ المحرف '#' يُستخدم في بايثون لكتابة التعليقات. يُمكِن إعطاء صلاحيات التنفيذ للبرمجيّة باستخدام الأمر chmod، كما أدناه:

$ chmod +x myscript.py

لا يوجد في نظام ويندوز مفهوم "الوضع التنفيذي (executable mode)". سيقوم مُثبِّت بايثون تلقائيًا بربط الملفات ذات اللاحقة ‎.py‎ بالمُفسِر (الملف python.exe)، أي أنَّه بِمُجرَد الضغط المزدوج على ملف بايثون سيعمل كبرمجيّة مباشرةً. يتعرَّف المُفسِر على ملفات باللاحقة ‎.pyw‎ أيضًا، ولكن بهذه الحالة لن يظهر موجِّه الأوامر (console) عند تنفيذ البرمجيّة.

ملفات بدء التشغيل في الوضع التفاعلي

من المفيد كثيرًا تنفيذ بعد الأوامر القياسيّة في كل مرَّة تدخل فيها إلى الوضع التفاعلي. يمكنك إعداد شيء كهذا باستخدام ملفات بدء التشغيل (start-up files)؛ وذلك عبر إسناد مسار الملف الذي يحتوي على تلك الأوامر إلى مُتغيّر البيئة PYTHONSTARTUP. هذا مماثِل لاستخدام الملف ‎.profile‎ في صدفة يونكس (UNIX shell).

يُقرأ هذا الملف فقط في جلسات الوضع التفاعلي، وليس عندما يقرأ المُفسِر الشيفرات من ملف (أي برمجيّة)، وأيضًا ليس عندما تُمرَّر الشيفرات من ‎/dev/tty‎ بشكل صريح (سيُقرأ الملف كما لو كان في جلسة تفاعليّة إن لم يُصرَّح بذلك). تُتفَّذ الأوامر في ملف بدء التشغيل في نفس مجال الأسماء الذي تُنفَّذ فيه الأوامر في الوضع التفاعلي، ما يعني أنَّه يُمكِن استخدام الكائِنات التي عُرِّفَت أو استورِدت - في ملف بدء التشغيل - مباشرةً - من دون تكرار تعريفها أو استيرادها - في الوضع التفاعلي. يُمكِنُك أيضًا تغيير شكل المُحِث الرئيسي (المُخزَّن بالمُتغيّر sys.ps1) والمُحِث الثانوي (المُخزَّن بالمُتغيّر sys.ps2) في ملف بدء التشغيل.

إذا أردتَ قراءة ملف بدء تشغيل إضافي، يمكنك برمجة ذلك في الملف الأساسي (الذي سيُسنَد مساره للمتغيّر PYTHONSTARTUP) باستخدام شيفرة مثل:

‎‎if os.path.isfile('.pythonrc.py'):
    exec(open('.pythonrc.py').read())

إذا أردت استخدام ملف بدء تشغيل في برمجيّتك، فعليك كتابة ذلك بشكل صريح في شيفرة البرمجيّة:

‎‎import os
filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename):
    with open(filename) as fobj:
        startup_file = fobj.read()
    exec(startup_file)

وحدات تخصيص المُفسِر

يتوفر في بايثون وحدتين لتخصيص المُفسِر: الوحدة sitecustomize و usercustomize. لرؤية آلية عملهم، عليك بدايةً معرفة مسار دليل حزم المُستخدِم (site-package directory). افتح المُفسِر ونفِّذ الأوامر التالية للقيام بذلك:

‎‎>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python3.5/site-packages'

يمكنك الآن إنشاء ملف بالاسم usercustomize.py في ذلك الدليل ووضع ما ترغب به هناك. سيعمل هذا الملف في كل مرَّة يتم استدعاء فيها المُفسِر ما لم يُستدعَ مع الخيار ‎‎-s المُخصَّص لتعطيل الاستيراد التلقائي.

تعمل الوحدة sitecustomize بشكل مُشابِه، إلا أنَّها توضَع عادةً من قبل مدير النظام في دليل الحزم العام، كما يتم استدعاءها قبل استدعاء الوحدة usercustomize. راجع توثيق الوحدة site للمزيد من التفاصيل.

مصادر