कैसे Django में डिबग करने के लिए, अच्छा तरीका है? [बन्द है]


587

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

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

लेकिन क्या इसमें सुधार किया जा सकता है? क्या आपके Django कोड को डीबग करने के लिए कुछ अच्छे टूल या बेहतर तरीके हैं?


2
मैं django- डिबग-टूलबार का उपयोग करना पसंद करता हूं, इसका बहुत ही हाथ
डिएगो विनीसस

1
या दृश्य स्टूडियो कोड का उपयोग करें पायथन डिबगर में बनाया गया है जैसा कि यहां बताया गया है। code.visualstudio.com/docs/python/tutorial-django
Nick T

जवाबों:


536

इसे करने के तरीकों का एक समूह है, लेकिन सबसे सीधा यह है कि केवल पायथन डिबगर का उपयोग करें । बस एक Django दृश्य समारोह में निम्नलिखित पंक्ति जोड़ें:

import pdb; pdb.set_trace()

या

breakpoint()  #from Python3.7

यदि आप अपने ब्राउज़र में उस पृष्ठ को लोड करने का प्रयास करते हैं, तो ब्राउज़र लटका रहेगा और आपको वास्तविक निष्पादन कोड पर डीबगिंग करने के लिए संकेत मिलेगा।

हालांकि अन्य विकल्प हैं (मैं उन्हें अनुशंसित नहीं कर रहा हूं):

* return HttpResponse({variable to inspect})

* print {variable to inspect}

* raise Exception({variable to inspect})

लेकिन पायथन कोड के सभी प्रकार के लिए पायथन डिबगर (पीडीबी) की अत्यधिक सिफारिश की जाती है। यदि आप पहले से ही pdb में हैं, तो आप IPDB पर भी एक नज़र डालना चाहते हैं जो डीबगिंग के लिए ipython का उपयोग करता है ।

पीडीबी के लिए कुछ और उपयोगी विस्तार हैं

pdb ++ , Antash द्वारा सुझाया गया।

pudb , ने सुझाव दिया PatDuJour

सीफांग्स द्वारा सुझाए गए Django में पायथन डिबगर का उपयोग करना


64
Pdb सुझाने के लिए +1। हालांकि यह ध्यान देने योग्य है कि यह वास्तव में आपके स्थानीय मशीन पर विकास सर्वर का उपयोग करते समय काम करता है, क्योंकि संकेत कंसोल में दिखाई देगा।
डैनियल रोजमैन

12
नीचे दिए गए मेरे उत्तर के अनुसार django-pdb भी देखें । आपको manage.py runserver --pdbऔर manage.py test --pdbआज्ञा देता है ।
टॉम क्रिस्टी

4
@ डैनियल, पहले से ही चल रहे अजगर में सांत्वना देने के लिए रेनकोल देखें ।
फोब

12
की जाँच करें ipythonऔर साथ ही। Ipdb, जिसके साथ आता है ipython, टैब पूरा करने, रंगीन सिंटैक्स और अधिक :-) सुविधाएँ।
hobbes3

3
मुझे आपका उत्तर उपयोगी लगा लेकिन Django हमेशा के लिए मेरे ब्रेकप्वाइंट पर लटका हुआ था, जब मैं एक परीक्षण को डीबग करना चाह रहा था। इसलिए मैंने एक सूचनात्मक लेख देखा और पाया जिससे मुझे मदद मिली: v3.mike.tig.as/blog/2010/09/14/pdb
driftcatcher

228

मैं वास्तव में Werkzeug का इंटरैक्टिव डिबगर पसंद करता हूं । यह Django के डिबग पेज के समान है, सिवाय इसके कि आपको ट्रेसबैक के हर स्तर पर एक इंटरैक्टिव शेल मिलता है। यदि आप django- एक्सटेंशन का उपयोग करते हैं , तो आपको एक runserver_plusप्रबंधन आदेश मिलता है जो विकास सर्वर को शुरू करता है और आपको अपवादों पर Werkzeug का डिबगर देता है।

बेशक, आपको इसे केवल स्थानीय रूप से चलाना चाहिए, क्योंकि यह किसी भी ब्राउज़र को सर्वर के संदर्भ में मनमाने अजगर कोड को निष्पादित करने का अधिकार देता है।


2
क्या ब्राउज़र में दिखाए गए इंटरैक्टिव कंसोल में टैब को पूरा करना संभव है? "टैब" बस हमें अगले खुले कंसोल पर ले जाता है, मैं सोच रहा था कि क्या कोई महत्वपूर्ण संयोजन था, लेकिन मुझे एक नहीं मिला।
एरियल

@ एररेलग डिबगर को टैब पूरा नहीं होता है।
होकेन लिड

यदि आप API को डिबगिंग कर रहे हैं, तो आप django-rundbg की कोशिश कर सकते हैं जो Werkzeug डीबगर में थोड़ा ट्विस्ट जोड़ता है।
दीर्घावधि

यह केवल अप करने के लिए हैpython 3.3
टिमो

166

टेम्प्लेट टैग के लिए थोड़ा क्विक:

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

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

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


1
यह महान है। एक और बात आप कर सकते हैं यदि आपको टेम्पलेट की समस्या हो रही है तो jinja2 (कॉफ़िन के माध्यम से लोड) पर स्विच करना है - यह django टेम्प्लेट का एक विस्तार है, जो मेरी राय में सुधार है। यह टेम्पलेट और टेम्पलेट इनहेरिटेंस को ट्रेसबैक फ़्रेम में एकीकृत करता है, जो कि django की तुलना में बेहतर है।
व्रतपालन

ये बहुत प्यारी है। दुर्भाग्य से, इसे एक कोडबेस में एकीकृत करने के लिए एक साफ तरीका देखना मुश्किल है जो पीडीबी के आयात सहित किसी भी प्रतिबद्धता से इनकार करता है।
जॉन किपरस्की

83

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

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

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

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

मैं भी django-viewtools को pdb का उपयोग करके अंतःक्रियात्मक रूप से विचारों को डीबग करना पसंद करता था , लेकिन मैं इसका उपयोग नहीं करता।

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


65

मैं PyCharm (ग्रहण के रूप में एक ही pदेव) का उपयोग करता हूं । वास्तव में मुझे अपने कोड के माध्यम से कदम बढ़ाने और देखने के लिए सक्षम होने में मदद मिलती है कि क्या हो रहा है।


2
इसके बारे में सबसे अच्छी बात यह है कि यह सिर्फ काम करता है और पूरी तरह से सहज है। बस एक पंक्ति के बाईं ओर क्लिक करें और डीबग बटन दबाएं। यह Django स्रोत कोड के लिए भी अच्छी तरह से काम करता है अगर आप आंतरिक कोड कैसे काम करते हैं, इसकी बेहतर समझ प्राप्त करना चाहते हैं। इसे देखने से पहले मुझे कुछ समय लगा, लेकिन आप फ़ाइल नेविगेटर के बाहरी लाइब्रेरी फ़ोल्डर में किसी भी कोड में ब्रेकपॉइंट लगा सकते हैं।
माइकल ब्यलस्ट्रा

6
यह उल्लेख करने के लिए कि PyCharm क्रेडिट के लिए हुड के तहत PyDev डिबगर का उपयोग करता है।
मेडिएरोस


44

अब तक लगभग हर चीज का उल्लेख किया गया है, इसलिए मैं केवल यह जोड़ूंगा कि pdb.set_trace()एक के बजाय ipdb.set_trace () का उपयोग कर सकते हैं जो iPython का उपयोग करता है और इसलिए अधिक शक्तिशाली (स्वतः पूर्ण और अन्य उपहार) है। इसके लिए ipdb पैकेज की आवश्यकता है, इसलिए आपको केवल इसकी आवश्यकता हैpip install ipdb


2
मैं pdb ++ की सलाह देता हूं जो एक बहुत ही उपयोगी चिपचिपा मोड प्रदान करता है।
संदीप

34

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

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

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

अब आप चला सकते हैं: 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परीक्षण विफलताओं / त्रुटियों पर पीडीबी में तोड़ने के लिए ...

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 पर होस्ट की गई परियोजना , योगदान बेशक स्वागत योग्य है।


3
यह बहुत अच्छा होगा यदि आप फ़ाइल (लाइन नंबर) को तोड़ने के लिए निर्दिष्ट कर सकते हैं (केवल दृश्य नहीं)।
Anson MacKeracher

जिसके लिए मैं कोड में छोड़ सकता हूं जैसे कि टिप्पणी उत्पादन के भीतर निष्क्रिय हैं। शायद यह एक बुरा विरोधाभास है, लेकिन यह विली-नीली को प्रभावी ढंग से पट्टी करने और लागू करने के लिए बहुत अच्छा होगा।
ग्लिसरीन

मैंने इसे हाल ही में स्थापित किया है, लेकिन आज ही टॉम के django-pdb द्वारा प्रलेखित के रूप में अपनी देव सेटिंग में "POST_MORTEM = True" को कॉन्फ़िगर करने के लिए सोचा। अब मैं बस के साथ क्रूज कर सकता हूं और जब चीजें खराब होती हैं तो मैं समस्या के स्थान पर सही गिरा देता हूं। धन्यवाद टॉम!
जोसेफ शेयर्ड

21

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

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

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

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

1
धन्यवाद, यह बहुत अच्छा काम किया। - नोरेलॉडैड की हमें जरूरत थी
टॉम

क्या रिमोट सर्वर पर डिबग करने की एक विशेषता है - ग्रहण पीडदेव के समान जो मैं इस समय उपयोग करता हूं?
डैनियल सोकोलोव्स्की

मुझे इससे समस्या हो रही है। मैंने आपके कदमों का अनुसरण किया लेकिन फिर भी काम नहीं कर रहा है। यह * .py फ़ाइलों के ब्रेकप्वाइंट में ही रुकता है, * .html वाले में नहीं।
ब्लूफेंटेस

16

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


आपको ग्रहण के माध्यम से देव सर्वर चलाना होगा (कम प्रयास डिबगिंग अनुभव के लिए)। PyDev ने दूरस्थ डिबगिंग का दावा किया है, लेकिन इसका इस्तेमाल कभी नहीं किया है, मैं वास्तव में विकास के अनुभव की गुणवत्ता के लिए बात नहीं कर सकता। विवरण: pydev.org/manual_adv_remote_debugger.html
सिंथेसाइपरटेल

2
प्योगेव का रिमोट डीबगर, डीजेंगो के देव सर्वर के साथ काफी अद्भुत काम करता है। बस सुनिश्चित करें कि आपके पास "जब फ़ाइल बदली जाती है, तो स्वचालित रूप से पुनः लोड मॉड्यूल?" PyDev की रन / डीबग सेटिंग में विकल्प '' अक्षम ''। अन्यथा देव सर्वर और pydev दोनों डिबगिंग करते समय कोड को फिर से लोड करने का प्रयास करेंगे, जो उन दोनों को बहुत भ्रमित करता है।
coredumperror

12

मैं PyCharm का उपयोग करता हूं और इसे पूरे रास्ते से खड़ा करता हूं । यह मुझे थोड़ा महंगा लगा, लेकिन मुझे यह कहना होगा कि इससे जो फायदा होगा वह अनमोल है। मैंने कंसोल से डिबगिंग की कोशिश की और मैं लोगों को बहुत अधिक क्रेडिट देता हूं जो ऐसा कर सकते हैं, लेकिन मेरे लिए नेत्रहीन रूप से डिबग करने में सक्षम होने के कारण मेरा आवेदन महान है।

मुझे हालांकि कहना है, PyCharm बहुत अधिक स्मृति लेता है। लेकिन फिर, जीवन में कुछ भी अच्छा नहीं है। वे सिर्फ अपने नवीनतम संस्करण 3 के साथ आए थे। यह Django, फ्लास्क और Google AppEngine के साथ भी बहुत अच्छा खेलता है। तो, सभी में, मैं कहूंगा कि यह किसी भी डेवलपर के लिए एक बहुत ही उपयोगी उपकरण है।

यदि आप अभी तक इसका उपयोग नहीं कर रहे हैं, तो मैं PyCharm की शक्ति को देखने के लिए 30 दिनों के लिए परीक्षण संस्करण प्राप्त करने की सलाह दूंगा। मुझे यकीन है कि अन्य उपकरण भी उपलब्ध हैं, जैसे कि अप्टाना। लेकिन मुझे लगता है कि मैं भी उसी तरह से पसंद करता हूं जिस तरह से PyCharm दिखता है। मुझे लगता है कि मैं अपने ऐप्स को डीबग करना बहुत सहज महसूस करता हूं।


यह पहली आईडीई हो सकती है जिसे मैं कभी खरीदता हूं। वीएम में एक प्रोजेक्ट को डीबगिंग के लिए जादू की तरह लगता है।
रॉब

10

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

import IPython; IPython.embed()

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


मैंने फ़ाइल के शीर्ष पर ऐसा करने के लिए अब एक आदत बना ली है from IPython import embedऔर फिर जब भी मैं जल्दी से कोड में एक ब्रेकप्वाइंट जोड़ना चाहता हूं, मैं लिखता हूं embed()। समय बचाना। हमेशा के लिए छोरों में फंसने से बचने के लिए, मैं करता हूँembed();exit();
मयंक जायसवाल

@MayankJaiswal: मैं विम पर एक कुंजी मानचित्रण इस स्निपेट (और के लिए इसी तरह के टुकड़े को सम्मिलित करने के लिए किया था pudbऔर debugger;जावास्क्रिप्ट में) फ़ाइल मैं संपादन कर रहा हूँ में। मेरे द्वारा किए जाने के बाद, मैं ddब्रेकपॉइंट को हटाने के लिए बस (पूरी लाइन को हटा देता हूं )। यह डिबगर आयात लाइन को संस्करण नियंत्रण में रखने या फ़ाइल के शीर्ष पर आयात को पूर्व निर्धारित करने के जोखिम से बचा जाता है।
रेयान

10

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

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

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

तो यह जाता है।


टाइप का उपयोग करते हुए कमimport pudb;pu.db
Sławomir Lenart

6

मैं एपीडबी (विस्तारित पायथन डीबगर) की अत्यधिक अनुशंसा करता हूं।

https://bitbucket.org/dugan/epdb

Django या अन्य अजगर webservers डिबगिंग के लिए epdb के बारे में एक चीज जो मुझे पसंद है वह है epdb.serve () कमांड। यह एक ट्रेस सेट करता है और एक स्थानीय पोर्ट पर यह कार्य करता है जिसे आप कनेक्ट कर सकते हैं। विशिष्ट उपयोग के मामले:

मेरे पास एक दृष्टिकोण है कि मैं चरण-दर-चरण जाना चाहता हूं। मैं ट्रेस सेट करने के लिए इच्छित बिंदु पर निम्नलिखित सम्मिलित करूँगा।

import epdb; epdb.serve()

एक बार जब यह कोड निष्पादित हो जाता है, तो मैं पायथन इंटरप्रेटर खोलता हूं और सेवारत उदाहरण से जुड़ता हूं। मैं मानक pdb कमांड जैसे n, s, आदि का उपयोग करके सभी मानों और चरणों का विश्लेषण कर सकता हूं।

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

और टन है कि आप किसी भी समय टाइपिंग एपडब मदद के बारे में सीख सकते हैं।

यदि आप एक ही समय में कई एपडब इंस्टेंस को सेवा या कनेक्ट करना चाहते हैं, तो आप पोर्ट को सुनने के लिए निर्दिष्ट कर सकते हैं (डिफ़ॉल्ट रूप से 8060 है)। अर्थात

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

निर्दिष्ट न किए जाने पर होस्ट 'लोकलहोस्ट' को डिफॉल्ट करता है। मैंने इसे यहां प्रदर्शित करने के लिए फेंक दिया कि आप इसका उपयोग स्थानीय उदाहरण के अलावा किसी अन्य चीज़ को डीबग करने के लिए कैसे कर सकते हैं, जैसे आपके स्थानीय LAN पर विकास सर्वर। जाहिर है, अगर आप ऐसा करते हैं तो ध्यान रखें कि सेट ट्रेस कभी भी आपके प्रोडक्शन सर्वर पर न हो!

एक त्वरित नोट के रूप में, आप अभी भी एपीडब ( import epdb; epdb.set_trace()) के साथ स्वीकृत उत्तर के रूप में एक ही काम कर सकते हैं लेकिन मैं सेवा की कार्यक्षमता को उजागर करना चाहता था क्योंकि मैंने इसे बहुत उपयोगी पाया है।


epdb 2011 से अपडेट नहीं किया गया है। क्या आप कभी भी इसे Django और / या पायथन के नए संस्करणों का उपयोग करके समस्याओं में चलाते हैं?
सेपरमैन २६'१४

मैंने इसे पायथन 2 (विशेष रूप से 2.4-2.7) के खिलाफ उपयोग करने वाले मुद्दों में कभी नहीं चलाया है। मैंने इसे कुछ दिनों पहले ही इस्तेमाल किया था, वास्तव में। मैं पायथन 3. साथ की कोशिश की कभी नहीं किया है
Jacinda

1
मैं pjthon 2.7 पर django 1.8 चला रहा हूं और मैं epdb.connect से बात करने के लिए epdb.connect नहीं ले सकता। मुझे सिर्फ एक टाइमआउट मिलता है।
डेविड वॉटसन

6

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

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

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

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

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

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


PyCharm सिर्फ PyDev का उपयोग करता है मुझे लगता है, इसका अपना नहीं।
रॉब

6

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

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

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


5

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

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

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

import wdb
wdb.set_trace()

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

उन लोगों के लिए जो परियोजना को नहीं जानते हैं, wdb pdb की तरह एक अजगर डिबगर है, लेकिन एक चालाक वेब फ्रंट-एंड और अतिरिक्त सुविधाओं के साथ, जैसे:

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

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


पीडीबी के साथ अंतर क्या है?
डुनोटोटॉस

4

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



2

अधिकांश विकल्पों का उल्लेख अलविदा है। टेम्प्लेट संदर्भ को प्रिंट करने के लिए, मैंने उसके लिए एक साधारण लाइब्रेरी बनाई है। Https://github.com/edoburu/django-debugtools देखें

आप इसका उपयोग बिना किसी {% load %}निर्माण के टेम्पलेट संदर्भ को प्रिंट करने के लिए कर सकते हैं :

{% print var %}   prints variable
{% print %}       prints all

यह <pre>टैग में चरों को प्रदर्शित करने के लिए एक कस्टमाइज्ड प्रिंट प्रारूप का उपयोग करता है ।


2

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


2

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

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

2

मेरे अपने अनुभव से, दो तरीके हैं:

  1. ipdb का उपयोग करें , जो कि एक बढ़ा हुआ डिबगर है, जिसे pdb पसंद है।

    import ipdb;ipdb.set_trace()या breakpoint() (अजगर 3.7 से)

  2. django शेल का उपयोग करें, बस नीचे दिए गए कमांड का उपयोग करें। जब आप एक नया दृष्टिकोण विकसित कर रहे हैं तो यह बहुत सहायक है।

    python manage.py shell


1

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

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 का उपयोग कर रहा हूं


1

जैसा कि यहां अन्य पोस्ट में उल्लेख किया गया है - अपने कोड में ब्रेकप्वाइंट सेट करना और कोड को चलना यह देखने के लिए कि क्या यह व्यवहार करता है जैसा कि आप उम्मीद करते हैं, Django जैसी कुछ सीखने का एक शानदार तरीका है जब तक कि आपके पास यह समझ नहीं है कि यह सब कैसे व्यवहार करता है - और आपका कोड क्या है कर रहा है।

ऐसा करने के लिए मैं WingIde का उपयोग करने की सलाह दूंगा। अन्य उल्लिखित आईडीई की तरह ही अच्छा और प्रयोग करने में आसान, अच्छा लेआउट और ब्रेकपॉइंट का मूल्यांकन करने के लिए आसान / स्टैक को संशोधित करना आदि। यह देखने के लिए कि आपका कोड क्या कर रहा है, यह देखने के लिए बिल्कुल सही है। मैं इसका बहुत बड़ा प्रशंसक हूं।

इसके अलावा, मैं PyCharm का उपयोग करता हूं - इसमें उत्कृष्ट स्थिर कोड विश्लेषण है और कभी-कभी समस्याओं का पता लगाने में मदद कर सकते हैं इससे पहले कि वे वहां हों।

जैसा कि पहले ही उल्लेख किया गया है कि django-debug-toolbar आवश्यक है - https://github.com/django-debug-toolbar/django-debug-toolbar

और स्पष्ट रूप से डिबग या विश्लेषण उपकरण नहीं है - मेरे पसंदीदा में से एक एसक्यूएल प्रिंटिंग मिडलवेयर है जो Django Snippets से https://djangosnippets.org/snippets/290/ पर उपलब्ध है।

यह एसक्यूएल प्रश्नों को प्रदर्शित करेगा जो आपके विचार से उत्पन्न हुए हैं। यह आपको एक अच्छी समझ देगा कि ओआरएम क्या कर रहा है और यदि आपके प्रश्न कुशल हैं या आपको अपने कोड (या कैशिंग जोड़ने) की आवश्यकता है।

मुझे अपने एप्लिकेशन को विकसित और डीबग करते समय क्वेरी के प्रदर्शन पर नज़र रखने के लिए यह अमूल्य लगता है।

बस एक अन्य टिप - मैंने इसे केवल अपने सारांश के लिए थोड़ा सा संशोधित करने के लिए संशोधित किया और एसक्यूएल स्टेटमेंट नहीं .... इसलिए मैं हमेशा इसे विकसित और परीक्षण करते समय उपयोग करता हूं। मैंने यह भी जोड़ा कि यदि लेन (कनेक्शन.क्वेरीज़) एक पूर्व-निर्धारित सीमा से अधिक है तो यह एक अतिरिक्त चेतावनी प्रदर्शित करता है।

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


1

उपयोग pdbया ipdb। इन दोनों के बीच का अंतर ipdb ऑटो पूर्ण का समर्थन करता है।

पीडीबी के लिए

import pdb
pdb.set_trace()

ipdb के लिए

import ipdb
ipdb.set_trace()

नई लाइन हिट nकुंजी निष्पादित करने के लिए, हिट cकुंजी जारी रखें। का उपयोग करके अधिक विकल्पों की जाँच करेंhelp(pdb)


0

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

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

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

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'))]]

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


0

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

assert False, value

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.