python - Django में अच्छा तरीके से कैसे डिबग करें?




debugging (18)

तो, मैंने Python और बाद में Django में कोड सीखना शुरू कर दिया। पहली बार यह ट्रेसबैक पर मुश्किल लग रहा था और वास्तव में यह पता लगाया कि मैंने क्या गलत किया और जहां वाक्यविन्यास त्रुटि थी। कुछ समय बीत चुका है और रास्ते में कुछ रास्ता, मुझे लगता है कि मुझे अपने डीजेगो कोड को डीबग करने में नियमितता मिली है। चूंकि यह मेरे कोडिंग अनुभव में जल्दी ही किया गया था, मैं बैठ गया और सोच रहा था कि मैं यह कैसे कर रहा था यह अप्रभावी था और तेजी से किया जा सकता था। मैं आमतौर पर अपने कोड में कीड़े को खोजने और सही करने का प्रबंधन करता हूं, लेकिन मुझे आश्चर्य है कि मुझे इसे तेजी से करना चाहिए?

मैं आम तौर पर डीबग जानकारी का उपयोग करता हूं जब सक्षम होने पर Django देता है। जब चीजें खत्म होती हैं, जैसा कि मैंने सोचा था, तो मैं एक वाक्यविन्यास त्रुटि के साथ कोड प्रवाह को तोड़ देता हूं, और प्रवाह के उस बिंदु पर चर को देखने के लिए, जहां कोड चाहता था उससे कुछ और करता है।

लेकिन क्या यह सुधार किया जा सकता है? क्या आपके डीजेगो कोड को डीबग करने के कुछ अच्छे उपकरण या बेहतर तरीके हैं?


Django कोड डीबग करने का आपका सबसे अच्छा विकल्प wdb के माध्यम से है: https://github.com/Kozea/wdb

wdb पायथन 2 (2.6, 2.7), पायथन 3 (3.2, 3.3, 3.4, 3.5) और पिल्ला के साथ काम करता है। इससे भी बेहतर, एक पायथन 2 प्रोग्राम को एक पायदान 3 प्रोग्राम पर डीबग करना संभव है, जिसमें पाइथन 3 पर चल रहे एक डब्ल्यूडीबी सर्वर और कंप्यूटर पर चल रहे प्रोग्राम को डीबग करना एक तीसरे कंप्यूटर पर किसी वेब कंप्यूटर के अंदर किसी अन्य कंप्यूटर पर चल रहे डिबगिंग सर्वर के साथ है! यहां तक ​​कि betterer, अब वेब इंटरफ़ेस से कोड इंजेक्शन का उपयोग कर वर्तमान में चल रहे पायथन प्रक्रिया / थ्रेड को रोकना संभव है। (इसके लिए gdb और ptrace सक्षम होना आवश्यक है) दूसरे शब्दों में यह अच्छी सुविधाओं के साथ सीधे आपके ब्राउज़र में पीडीबी का एक बहुत उन्नत संस्करण है।

सर्वर को स्थापित और चलाएं, और अपने कोड में जोड़ें:

import wdb
wdb.set_trace()

लेखक के अनुसार, pdb संबंध में मुख्य मतभेद हैं:

उन लोगों के लिए जो परियोजना को नहीं जानते हैं, डब्ल्यूडीबी पीडीबी की तरह एक पायथन डीबगर है, लेकिन एक स्लिम वेब फ्रंट एंड और कई अतिरिक्त फीचर्स के साथ, जैसे कि:

  • स्रोत वाक्यविन्यास हाइलाइटिंग
  • दृश्य ब्रेकपॉइंट्स
  • जेडीआई का उपयोग कर इंटरेक्टिव कोड पूरा करना
  • लगातार ब्रेकपॉइंट्स
  • माउस मल्टीथ्रेडिंग / मल्टीप्रोसेसिंग समर्थन का उपयोग कर दीप ऑब्जेक्ट्स निरीक्षण
  • रिमोट डीबगिंग
  • अभिव्यक्ति देखें
  • डीबगर कोड संस्करण में
  • त्रुटि पर तोड़ने के लिए लोकप्रिय वेब सर्वर एकीकरण
  • उदाहरण के लिए werkzeug डीबगर के विपरीत ट्रेस (पोस्ट-मॉर्टम नहीं) के दौरान अपवाद तोड़ने में
  • कोड इंजेक्शन के माध्यम से वर्तमान में चल रहे कार्यक्रमों में ब्रेक लगाना (समर्थित सिस्टम पर)

इसमें एक शानदार ब्राउज़र-आधारित यूजर इंटरफेस है। उपयोग करने के लिए एक खुशी! :)


अगर django विकास के लिए Aptana का उपयोग कर, यह देखें: http://www.youtube.com/watch?v=qQh-UQFltJQ

यदि नहीं, तो इसका उपयोग करने पर विचार करें।


उन लोगों के लिए जो गलती से लाइव प्रतिबद्धताओं में पीडीबी जोड़ सकते हैं, मैं # कोउबज़ उत्तर के इस विस्तार का सुझाव दे सकता हूं:

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element

एक अतिरिक्त सुझाव।

आप मैन्युअल रूप से pdb.set_trace() को अपने विचारों में इंजेक्शन pdb.set_trace() बजाय, pdb.set_trace() और pdb का लाभ उठा सकते हैं। लाभ यह है कि जब आप पहली बार शुरू करते हैं, तो संभावित रूप से तृतीय पक्ष कोड में आप त्रुटि शर्तों का निरीक्षण कर सकते हैं।

आज मेरे लिए एक त्रुटि यहाँ है।

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

अब, मुझे पता है इसका मतलब है कि मैंने फॉर्म के लिए कन्स्ट्रक्टर को गुमराह किया, और मुझे यह भी अच्छा विचार है कि कौन सा क्षेत्र एक समस्या है। लेकिन, क्या मैं यह देखने के लिए पीडीबी का उपयोग कर सकता हूं कि टेम्पलेट के भीतर कौन सी कुरकुरा रूप शिकायत कर रही है?

हाँ मैं कर सकता हूँ। Nosetests पर --pdb विकल्प का उपयोग करना:

tests$ nosetests test_urls_catalog.py --pdb

जैसे ही मैंने कोई अपवाद मारा (जिसमें खूबसूरत तरीके से संभाला गया था), पीडीबी बंद हो जाता है जहां यह होता है और मैं चारों ओर देख सकता हूं।

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

अब, यह स्पष्ट है कि मेरी पसंद कुरकुरा क्षेत्र कन्स्ट्रक्टर के लिए तर्क थी क्योंकि यह सूची में एक सूची थी, बजाय टुपल्स की सूची / टुपल।

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

साफ बात यह है कि यह पीडीबी क्रिस्पी कोड के भीतर हो रहा है, मेरा नहीं और मुझे इसे मैन्युअल रूप से डालने की आवश्यकता नहीं थी।


ऐसे कुछ टूल हैं जो अच्छी तरह से सहयोग करते हैं और आपके डिबगिंग कार्य को आसान बना सकते हैं।

Django डीबग टूलबार सबसे महत्वपूर्ण है।

फिर आपको पाइथन logging सुविधा का उपयोग करके अच्छी लॉगिंग की आवश्यकता है। आप लॉग फ़ाइल में लॉगिंग आउटपुट भेज सकते हैं, लेकिन एक आसान विकल्प firepython लॉग आउटपुट भेज रहा है। इसका उपयोग करने के लिए आपको firebug एक्सटेंशन के साथ फ़ायरफ़ॉक्स ब्राउज़र का उपयोग करने की आवश्यकता है। फ़ायरपीथॉन में एक फ़ायरबग प्लगइन शामिल है जो फ़ायरबग टैब में किसी भी सर्वर-साइड लॉगिंग प्रदर्शित करेगा।

आपके द्वारा विकसित किसी भी ऐप के जावास्क्रिप्ट पक्ष को डीबग करने के लिए फ़ायरबग भी महत्वपूर्ण है। (मान लें कि आपके पास निश्चित रूप से कुछ जेएस कोड है)।

मुझे django-viewtools का उपयोग करके इंटरैक्टिव रूप से डीबगिंग विचारों के लिए django-viewtools भी पसंद आया, लेकिन मैं इसका अधिक उपयोग नहीं करता हूं।

मेमोरी लीक को ट्रैक करने के लिए डोजर जैसे अधिक उपयोगी टूल हैं (स्मृति ट्रैकिंग के लिए SO पर उत्तर में दिए गए अन्य अच्छे सुझाव भी दिए गए हैं)।


कभी-कभी जब मैं किसी विशेष विधि में चारों ओर अन्वेषण करना चाहता हूं और पीडीबी को बुलावा करना बहुत बोझिल है, तो मैं जोड़ूंगा:

import IPython; IPython.embed()

IPython.embed() एक IPython.embed() खोल शुरू करता है जिसके पास उस बिंदु से स्थानीय चरों तक पहुंच होती है जहां आप इसे कॉल करते हैं।


टेम्पलेट टैग के लिए एक छोटी quickie:

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

अब, एक टेम्पलेट के अंदर आप {{ template_var|pdb }} कर सकते हैं और एक पीडीबी सत्र दर्ज कर सकते हैं (दिए गए आप स्थानीय डेवेल सर्वर चला रहे हैं) जहां आप अपने दिल की सामग्री के लिए element का निरीक्षण कर सकते हैं।

यह देखने का एक बहुत अच्छा तरीका है कि जब यह टेम्पलेट पर आता है तो आपके ऑब्जेक्ट के साथ क्या हुआ।


पाइथन डीबग करने का सबसे आसान तरीका - खासकर प्रोग्रामर के लिए जो विजुअल स्टूडियो में उपयोग किया जाता है - पीटीवीएस (विजुअल स्टूडियो के लिए पायथन टूल्स) का उपयोग कर रहा है। कदम सरल हैं:

  1. http://pytools.codeplex.com/ से इसे डाउनलोड और इंस्टॉल http://pytools.codeplex.com/
  2. ब्रेकपॉइंट्स सेट करें और F5 दबाएं।
  3. आपका ब्रेकपॉइंट हिट हो गया है, आप वैरिएबल को सी # / सी ++ प्रोग्राम डीबगिंग के रूप में आसान / बदल सकते हैं।
  4. बस इतना ही :)

यदि आप पीटीवीएस का उपयोग कर डीजेगो को डीबग करना चाहते हैं, तो आपको निम्न कार्य करने की आवश्यकता है:

  1. प्रोजेक्ट सेटिंग्स में - सामान्य टैब, "स्टार्टअप फ़ाइल" को "manage.py" पर सेट करें, जो Django प्रोग्राम का प्रवेश बिंदु है।
  2. प्रोजेक्ट सेटिंग्स में - डीबग टैब, "स्क्रिप्ट Arguments" को "runerver --noreload" पर सेट करें। मुख्य बिंदु यहां "--noreload" है। यदि आप इसे सेट नहीं करते हैं, तो आपके ब्रेकपॉइंट्स हिट नहीं होंगे।
  3. का आनंद लें।

मुझे बस wdb मिला ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 )। यह सभी घंटियाँ और सीटी के साथ एक बहुत अच्छा यूजर इंटरफेस / जीयूआई है। लेखक डब्ल्यूडीबी के बारे में यह कहते हैं -

"ऐसे PyEarm जैसे आईडीई हैं जिनके पास अपने स्वयं के डिबगर्स हैं। वे सुविधाओं के समान या समान सेट की पेशकश करते हैं ... हालांकि इनका उपयोग करने के लिए आपको उन विशिष्ट आईडीई का उपयोग करना होगा (और उनमें से कुछ गैर-मुक्त हैं या सभी के लिए उपलब्ध नहीं हो सकते हैं प्लेटफार्म)। अपनी जरूरतों के लिए सही उपकरण चुनें। "

सोचा था कि मैं इसे अभी पास कर दूंगा।

पायथन डीबगर्स के बारे में भी एक बहुत उपयोगी लेख: https://zapier.com/engineering/debugging-python-boss/

अंत में , यदि आप Django में अपने कॉल स्टैक का एक अच्छा ग्राफिकल प्रिंटआउट देखना चाहते हैं, तो चेकआउट: https://github.com/joerick/pyinstrument । बस pyinstrument.middleware.ProfilerMiddleware को MIDDLEWARE_CLASSES में जोड़ें, फिर प्रोफाइलर को सक्रिय करने के लिए अनुरोध URL के अंत में प्रोफ़ाइल जोड़ें।

कमांड लाइन से या मॉड्यूल के रूप में आयात करके pyinstrument भी चला सकते हैं।


मुझे लगता है कि विजुअल स्टूडियो कोड Django ऐप्स डीबग करने के लिए कमाल है। मानक पायथन लॉन्च.जेसन पैरामीटर डीबगर संलग्न के साथ python manage.py चलाते हैं, ताकि आप ब्रेकपॉइंट्स सेट कर सकें और अपनी पसंद के अनुसार अपने कोड के माध्यम से कदम उठा सकें।


मेरे परिप्रेक्ष्य से, हम सामान्य कोड डीबगिंग कार्यों को तीन अलग-अलग उपयोग पैटर्न में तोड़ सकते हैं:

  1. कुछ ने अपवाद उठाया है : django-extensions 'बचाव के लिए Werkzeug डीबगर। सभी ट्रेस स्तरों पर कस्टम कोड चलाने की क्षमता एक हत्यारा है। और यदि आप पूरी तरह से अटक गए हैं, तो आप केवल एक क्लिक के साथ साझा करने के लिए एक गिस्ट बना सकते हैं।
  2. पेज प्रस्तुत किया जाता है, लेकिन परिणाम गलत है : फिर, Werkzeug चट्टानों। कोड में ब्रेकपॉइंट बनाने के लिए, उस स्थान assert False केवल उस assert False डालें टाइप करें जिसे आप रोकना चाहते हैं।
  3. कोड गलत काम करता है , लेकिन त्वरित देखो मदद नहीं करता है। सबसे अधिक, एक एल्गोरिदमिक समस्या। आह। फिर मैं आमतौर पर एक कंसोल डीबगर pudb आग pudb : import pudb; pudb.set_trace() import pudb; pudb.set_trace() । [I] पीडीबी पर मुख्य लाभ यह है कि पुडबी (जब आप 80 के दशक में दिख रहे हैं) कस्टम घड़ी अभिव्यक्तियों को हवा बनाते हैं। और नेस्टेड लूप का एक समूह डीबग करना एक जीयूआई के साथ बहुत आसान है।

आह, हाँ, टेम्पलेट्स की विपत्तियां। सबसे आम (मेरे और मेरे सहयोगियों के लिए) समस्या एक गलत संदर्भ है: या तो आपके पास कोई चर नहीं है, या आपके चर के पास कुछ विशेषता नहीं है। यदि आप डीबग टूलबार का उपयोग कर रहे हैं, तो बस "टेम्पलेट्स" अनुभाग पर संदर्भ का निरीक्षण करें, या, यदि यह पर्याप्त नहीं है, तो अपने संदर्भ भरने के ठीक बाद अपने विचारों के कोड में ब्रेक सेट करें।

तो यह जाता है।


मैं PyCharm और विभिन्न डीबग उपकरण का उपयोग करें। नौसिखियों के लिए उन चीजों को आसान बनाने के बारे में भी एक अच्छा लेख सेट करें। आप यहां से शुरू कर सकते हैं। यह डीजेगो परियोजनाओं के साथ सामान्य रूप से पीडीबी और जीयूआई डीबगिंग के बारे में बताता है। उम्मीद है कि कोई उन्हें फायदा होगा।


मैं PyCharm (ग्रहण के रूप में एक ही pydev इंजन) का उपयोग करें। वास्तव में मुझे अपने कोड के माध्यम से कदम उठाने में सक्षम होने और क्या हो रहा है यह देखने में मदद करता है।


मैं pyDev साथ pyDev उपयोग वास्तव में अच्छा है, सेट ब्रेक पॉइंट्स, कोड में कदम, किसी भी ऑब्जेक्ट्स और वैरिएबल पर मानों को देखते हैं, इसे आज़माएं।


मैं अत्यधिक पीडीबी का उपयोग करने का सुझाव देता हूं।

import pdb
pdb.set_trace()

आप सभी चर मूल्यों का निरीक्षण कर सकते हैं, फ़ंक्शन में कदम उठा सकते हैं और बहुत कुछ कर सकते हैं। https://docs.python.org/2/library/pdb.html

डेटाबेस के सभी प्रकार के अनुरोध, प्रतिक्रिया और हिट की जांच के लिए। मैं django-debug-toolbar का उपयोग कर रहा हूं https://github.com/django-debug-toolbar/django-debug-toolbar


मैंने django-pdb django-pdb django-pdb को django-pdb धक्का दिया है। यह एक साधारण ऐप है जिसका मतलब है कि जब भी आप पीडीबी में तोड़ना चाहते हैं तो आपको अपने स्रोत कोड को संपादित करने की आवश्यकता नहीं है।

स्थापना सिर्फ है ...

  1. pip install django-pdb
  2. अपने INSTALLED_APPS 'django_pdb' जोड़ें

अब आप चला सकते हैं: manage.py runserver --pdb प्रत्येक दृश्य की शुरुआत में manage.py runserver --pdb में तोड़ने के लिए ...

bash: manage.py runserver --pdb
Validating models...

0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}

> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)

और चलाएं: manage.py test --pdb परीक्षण विफलताओं / त्रुटियों पर manage.py test --pdb में तोड़ने के लिए ...

bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
    one_plus_one = four
NameError: global name 'four' is not defined
======================================================================

> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)

GitHub पर प्रोजेक्ट की मेजबानी की गई, योगदान का स्वागत है।


विकास के दौरान, एक त्वरित जोड़ना

assert False, value

डीबगर का उपयोग करने की आवश्यकता के बिना विचारों या कहीं और समस्याओं का निदान करने में मदद कर सकते हैं।


import pdb; pdb.set_trace() जोड़ें import pdb; pdb.set_trace() import pdb; pdb.set_trace() पायथन कोड में इसी पंक्ति पर और इसे निष्पादित करें। निष्पादन एक इंटरैक्टिव खोल के साथ बंद हो जाएगा। खोल में आप पाइथन कोड (यानी प्रिंट चर) निष्पादित कर सकते हैं या कमांड का उपयोग कर सकते हैं जैसे कि:

  • c निष्पादन जारी रखें
  • एक ही समारोह के भीतर अगली पंक्ति के लिए कदम
  • इस फ़ंक्शन या बुलाए गए फ़ंक्शन में अगली पंक्ति में कदम
  • q डीबगर / निष्पादन से बाहर निकलें

यह भी देखें: https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28





debugging