كيفية جعل PDB يتعرف على أن المصدر قد تغير بين المدى؟
سؤال
من ما يمكنني أن أقول إليه، لا يتعرف PDB عند تغيير رمز المصدر بين "يعمل". هذا هو، إذا قمت بتصحيح الأخطاء، لاحظ خطأ، إصلاح هذا الخطأ، وأعد تشغيل البرنامج في PDB (أي دون الخروج من PDB)، لن يقوم PDB بإعادة ترجمة التعليمات البرمجية. ما زلت أخطب إصدار الإصدار القديم من التعليمات البرمجية، حتى إذا كان PDB يسرد التعليمات البرمجية المصدر الجديدة.
لذلك، لا يقوم PDB بتحديث التعليمات البرمجية المترجمة مثل التغييرات المصدر؟ إذا لم يكن الأمر كذلك، هل هناك طريقة لجعلها تفعل ذلك؟ أود أن أكون قادرا على البقاء في جلسة PDB واحدة من أجل الحفاظ على نقاط توقفي ومثل هذه.
سوف يلاحظ FWIW، GDB عندما يقوم البرنامج بتغييرات تصحيح الأخطاء أسفله، على الرغم من إعادة تشغيل هذا البرنامج فقط. هذا هو السلوك الذي أحاول النسخ المتماثل في PDB.
المحلول
ماذا تقصد ب "rerun البرنامج في PDB؟" إذا قمت باستيراد وحدة نمطية، فلن يقوم Python بإعادة قراءة ذلك إلا إذا طلبت صريحا للقيام بذلك، أي مع reload(module)
. وبعد ومع ذلك، reload
بعيد عن مقاوم للرصاص (انظر Xreload. لاستراتيجية أخرى).
هناك الكثير من المزالق في إعادة تحميل رمز بيثون. لحل مشكلتك أكثر قوة، يمكنك التفاف PDB مع فئة تسجل معلوماتك الإيقافية إلى ملف على القرص، على سبيل المثال، وتشغيلها مرة أخرى على الأمر.
(عذرا، تجاهل الإصدار الأول من هذه الإجابة؛ من المبكر، لم أقرأ سؤالك بعناية بما فيه الكفاية.)
نصائح أخرى
قد تساعد الوحدة الصغيرة التالية. إذا قمت باستيراده في جلسة PDB الخاصة بك، فيمكنك استخدام:
pdb> pdbs.r()
في أي وقت لإجبار جميع الوحدات غير النظامية باستثناء رئيسي. وبعد يتخطى التعليمات البرمجية أنه لأنه يلقي بالتنفذ ("لا يمكن إعادة إتاحة الوحدة الداخلية رئيسي') استثناء.
# pdbs.py - PDB support
from __future__ import print_function
def r():
"""Reload all non-system modules, so a pdb restart
will reload anything new
"""
import sys
# This is likely to be OS-specific
SYS_PREFIX = '/usr/lib'
for k, v in sys.modules.items():
if not hasattr(v, '__file__'):
continue
if v.__file__.startswith(SYS_PREFIX):
continue
if k == '__main__':
continue
print('reloading %s [%s]' % (k, v.__file__))
reload(v)
IPDB %autoreload
تمديد
6.2.0 وثيقة مستندات http://ipython.readtheedocs.io/en/stable/config/extensions/autoreload.html#module-ipython.extensions.autoreload. :
In [1]: %load_ext autoreload
In [2]: %autoreload 2
In [3]: from foo import some_function
In [4]: some_function()
Out[4]: 42
In [5]: # open foo.py in an editor and change some_function to return 43
In [6]: some_function()
Out[6]: 43