كيفية جعل PDB يتعرف على أن المصدر قد تغير بين المدى؟

StackOverflow https://stackoverflow.com/questions/724924

  •  05-09-2019
  •  | 
  •  

سؤال

من ما يمكنني أن أقول إليه، لا يتعرف 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top