पायथन डिबगिंग युक्तियाँ [बंद]


164

पायथन डिबगिंग के लिए आपके सबसे अच्छे सुझाव क्या हैं?

कृपया बिना किसी विशेष डिबगर को यह कहे सूचीबद्ध न करें कि यह वास्तव में क्या कर सकता है।

सम्बंधित


जवाबों:


139

PDB

आप पीडीबी मॉड्यूल का उपयोग कर सकते हैं, pdb.set_trace()कहीं भी सम्मिलित कर सकते हैं और यह ब्रेकपॉइंट के रूप में कार्य करेगा।

>>> import pdb
>>> a="a string"
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) p a
'a string'
(Pdb)

निष्पादन का उपयोग c( contया continue) जारी रखने के लिए ।

Pdb का उपयोग करके मनमानी पायथन अभिव्यक्तियों को निष्पादित करना संभव है। उदाहरण के लिए, यदि आपको कोई गलती मिलती है, तो आप कोड को सही कर सकते हैं, फिर रनिंग कोड में समान प्रभाव डालने के लिए एक प्रकार की अभिव्यक्ति टाइप करें

ipdb IPython के लिए pdb का एक संस्करण है । यह टैब पूरा होने सहित सभी IPython सुविधाओं के साथ पीडीबी के उपयोग की अनुमति देता है।

यह भी संभव है कि पीडीबी को स्वचालित रूप से बिना किसी अपवाद के चलाने के लिए सेट किया जाए

Pydb को Pdb का एक उन्नत संस्करण होने के लिए लिखा गया था। लाभ?


: यहाँ pdb का उपयोग करने पर एक लेख है sontek.net/debugging-python-with-pdb
sontek

निजी तौर पर, मुझे ipdb ज्यादा अच्छा लगता है।
सरथ्रियन -

1
जाहिरा तौर पर वहाँ pydbgr कहा जाता है pydb
एहतेश चौधरी

: SublimeText करने के लिए कोड अजगर breakpoints को जोड़ने के लिए एक महान प्लगइन है sublime.wbond.net/packages/Python%20Breakpoints
डेनिस Golomazov

यदि आप एक वेब एप्लिकेशन विकसित कर रहे हैं, तो myserver.com/pdbडिबग मोड के लिए एक दृश्य जोड़ें जो बस करता है import pdb; pdb.set_trace()। यदि आप Flask / Werkzeug का उपयोग कर रहे हैं जिसमें एक इंटरैक्टिव डिबगर है, तो आप एक ऐसा दृश्य भी देख सकते हैं जो बस करता है assert False
osa

78

http://pypi.python.org/pypi/pudb , एक पूर्ण-स्क्रीन, कंसोल-आधारित पायथन डीबगर।

इसका लक्ष्य आधुनिक जीयूआई-आधारित डीबगर्स की सभी बारीकियों को अधिक हल्के और कीबोर्ड-अनुकूल पैकेज में प्रदान करना है। PuDB आपको कोड को डीबग करने की अनुमति देता है जहां आप लिखते हैं और इसे एक परीक्षण करते हैं - एक टर्मिनल में। यदि आपने उत्कृष्ट (लेकिन आजकल के प्राचीन) डॉस-आधारित टर्बो पास्कल या सी टूल के साथ काम किया है, तो PuDB का UI परिचित लग सकता है।

pudb स्क्रीनशॉट

स्टैंडअलोन स्क्रिप्ट को डीबग करने के लिए अच्छा है, बस चलाएं

python -m pudb.run my-script.py


40

यदि आप pdb का उपयोग कर रहे हैं, तो आप शॉर्टकट के लिए उपनाम परिभाषित कर सकते हैं। मैं इनका उपयोग करता हूं:

# Ned's .pdbrc

# Print a dictionary, sorted. %1 is the dict, %2 is the prefix for the names.
alias p_ for k in sorted(%1.keys()): print "%s%-15s= %-80.80s" % ("%2",k,repr(%1[k]))

# Print the instance variables of a thing.
alias pi p_ %1.__dict__ %1.

# Print the instance variables of self.
alias ps pi self

# Print the locals.
alias pl p_ locals() local:

# Next and list, and step and list.
alias nl n;;l
alias sl s;;l

# Short cuts for walking up and down the stack
alias uu u;;u
alias uuu u;;u;;u
alias uuuu u;;u;;u;;u
alias uuuuu u;;u;;u;;u;;u
alias dd d;;d
alias ddd d;;d;;d
alias dddd d;;d;;d;;d
alias ddddd d;;d;;d;;d;;d

आप इन उपनामों को कैसे परिभाषित करते हैं?
केसबश

9
इस सामान को ~ / .pdbrc
नेड

खिड़कियों पर आप इसे ~ / _ipyon / ipythonrc.ini में रख सकते हैं
फास्टमूलिपिलेशन

33

लॉगिंग

पायथन में पहले से ही एक उत्कृष्ट निर्मित लॉगिंग मॉड्यूल है । आप यहां लॉगिंग टेम्प्लेट का उपयोग करना चाह सकते हैं ।

लॉगिंग मॉड्यूल आपको महत्वपूर्ण स्तर निर्दिष्ट करता है; डिबगिंग के दौरान आप सब कुछ लॉग कर सकते हैं, जबकि सामान्य ऑपरेशन के दौरान आप केवल महत्वपूर्ण चीजों को लॉग कर सकते हैं। आप चीजों को बंद और चालू कर सकते हैं।

अधिकांश लोग बस डिबग करने के लिए मूल प्रिंट स्टेटमेंट का उपयोग करते हैं, और फिर प्रिंट स्टेटमेंट को हटा देते हैं। उन्हें छोड़ना बेहतर है, लेकिन उन्हें अक्षम करना; फिर, जब आपके पास एक और बग होता है, तो आप बस सब कुछ फिर से सक्षम कर सकते हैं और अपने लॉग को देख सकते हैं।

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

संपादित करें: टेम्प्लेट का मूल URL था: http://aymanh.com/python-debugging-techniques

यह पृष्ठ गायब है, इसलिए मैंने इसे आर्काइव में सहेजे गए स्नैपशॉट के संदर्भ के साथ प्रतिस्थापित कर दिया है । http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-teppiques

मामले में यह फिर से गायब हो जाता है, यहां वे टेम्पलेट हैं जिनका मैंने उल्लेख किया है। यह ब्लॉग से लिया गया कोड है; मैंने इसे नहीं लिखा।

import logging
import optparse

LOGGING_LEVELS = {'critical': logging.CRITICAL,
                  'error': logging.ERROR,
                  'warning': logging.WARNING,
                  'info': logging.INFO,
                  'debug': logging.DEBUG}

def main():
  parser = optparse.OptionParser()
  parser.add_option('-l', '--logging-level', help='Logging level')
  parser.add_option('-f', '--logging-file', help='Logging file name')
  (options, args) = parser.parse_args()
  logging_level = LOGGING_LEVELS.get(options.logging_level, logging.NOTSET)
  logging.basicConfig(level=logging_level, filename=options.logging_file,
                      format='%(asctime)s %(levelname)s: %(message)s',
                      datefmt='%Y-%m-%d %H:%M:%S')

  # Your program goes here.
  # You can access command-line arguments using the args variable.

if __name__ == '__main__':
  main()

और यहाँ उसका स्पष्टीकरण है कि उपरोक्त का उपयोग कैसे करें। फिर, मुझे इसका श्रेय नहीं मिलता है:


डिफ़ॉल्ट रूप से, लॉगिंग मॉड्यूल महत्वपूर्ण, त्रुटि और चेतावनी संदेश प्रिंट करता है। इसे बदलने के लिए ताकि सभी स्तर मुद्रित हों, उपयोग करें:

$ ./your-program.py --logging=debug

Debug.log नामक फ़ाइल में लॉग संदेश भेजने के लिए, उपयोग करें:

$ ./your-program.py --logging-level=debug --logging-file=debug.log


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

लिंक "लॉगिंग टेम्प्लेट यहां" मृत है। कृपया अद्यतन करें।
योहन

20

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

code.interact आपको एक इंटरैक्टिव कंसोल में ले जाता है

import code; code.interact(local=locals())

यदि आप अपने कंसोल इतिहास को आसानी से देखने में सक्षम होना चाहते हैं: " क्या मेरे पास शेल की तरह एक इतिहास तंत्र हो सकता है ? " (इसके लिए नीचे देखना होगा)।

दुभाषिया के लिए ऑटो-पूर्ण सक्षम किया जा सकता है ।



17

print बयान

  • कुछ लोग debug_printआसान अक्षम करने के लिए प्रिंट के बजाय फ़ंक्शन की सलाह देते हैं
  • pprintमॉड्यूल जटिल संरचनाओं के लिए अमूल्य है

3
+1 जब हर डिबगर विफल हो जाता है, तो प्रिंट आपका मित्र है, हां डिबग_प्रिंट अच्छा होगा
अनुराग उनियाल

मैं आमतौर पर पहले प्रिंट करता हूं फिर दूसरा डिबग करता हूं, जब मैं जानता हूं कि मैं एक विशेष खंड को ट्रेस करके हल कर
पाऊंगा

4
वास्तव में लॉग मॉड्यूल बस यही करता है।
ई-सिटिस

सही है, लेकिन लॉगिंग को सेट करना होगा। मैं
सीखूंगा कि

प्रिंट सरल मामलों के लिए उपयोगी हो सकता है और विशेष रूप से छोटे स्टार्टअप समय के साथ परियोजनाओं को विकसित करते समय। दूसरी तरफ यह नशे की लत हो सकती है और इसे अधिक जटिल परिदृश्यों में pdb या किसी अन्य डीबगर के ऊपर उपयोग करने से आमतौर पर आपको सिरदर्द होगा
vinilios

16

एक स्क्रिप्ट डिबग करने का स्पष्ट तरीका

python -m pdb script.py
  • उपयोगी है कि जब स्क्रिप्ट एक अपवाद उठाती है
  • जब virtualenv और pdb कमांड का उपयोग किया जा रहा है तो वेव्स पायथन संस्करण के साथ नहीं चल रहा है।

अगर आपको ठीक से पता नहीं है कि वह स्क्रिप्ट कहां है

python -m pdb ``which <python-script-name>``

15

PyDev

PyDev में एक बहुत अच्छा इंटरैक्टिव डिबगर है। इसमें घड़ी के भाव, हॉवर-से-मूल्यांकन, थ्रेड और स्टैक लिस्टिंग और (लगभग) सभी सामान्य सुविधाएं हैं जो आप एक आधुनिक दृश्य दर्शक से अपेक्षा करते हैं। आप एक चल रही प्रक्रिया से भी जुड़ सकते हैं और दूरस्थ डिबगिंग कर सकते हैं।

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


क्या इसमें संपादित करने और जारी रखने की क्षमता है?
केसबश

@CaseBash नहीं, यह नहीं है लेकिन यह सुविधा योजनाबद्ध है। भले ही इसके बिना, ब्रेकपॉइंट्स को सेट /
अनसेट


12

Winpdb बहुत अच्छा है, और इसके नाम के विपरीत यह पूरी तरह से क्रॉस-प्लेटफॉर्म है।

यह एक बहुत ही अच्छा प्रॉम्प्ट-आधारित और GUI डीबगर है, और दूरस्थ डीबगिंग का समर्थन करता है।


@Casebash - जोड़ा अधिक जानकारी के
orip

1
+1 यह एकमात्र पायथन डिबगर है जिसे मैंने अब तक पाया है जो मल्टी-थ्रेडिंग को संभाल सकता है।
ली नेथर्टन

मल्टी-थ्रेडिंग के इसके "हैंडलिंग" से सावधान रहें - किसी भी धागे में कोई भी अपवाद पूरी प्रक्रिया को फ्रीज कर देता है। बुरी बात नहीं अगर आप इसके बारे में जानते हैं, बहुत दर्दनाक है अगर आप नहीं हैं
वॉल्ट डब्ल्यू

अप्रैल 2014 के रूप में यह परियोजना मृत दिखती है
आलोकज जनेज

7

विम में, मेरे पास ये तीन बाइंडिंग हैं:

map <F9> Oimport rpdb2; rpdb2.start_embedded_debugger("asdf") #BREAK<esc>
map <F8> Ofrom nose.tools import set_trace; set_trace() #BREAK<esc>
map <F7> Oimport traceback, sys; traceback.print_exception(*sys.exc_info()) #TRACEBACK<esc>

rpdb2एक रिमोट पायथन डीबगर है, जिसका उपयोग ठोस ग्राफिकल डीबगर WinPDB के साथ किया जा सकता है। क्योंकि मुझे पता है कि आप पूछेंगे, यह वह सब कुछ कर सकता है जिसकी मुझे एक ग्राफिकल डिबगर से उम्मीद है :)

मैं उपयोग pdbसे nose.toolsइतना है कि मैं इकाई परीक्षण के साथ ही सामान्य कोड डीबग कर सकते हैं।

अंत में, F7मैपिंग एक ट्रेसबैक प्रिंट करेगा (उसी तरह के जैसा आपको मिलता है जब स्टैक के शीर्ष पर एक अपवाद बुलबुले होता है)। मैंने पाया है कि यह वास्तव में कुछ समय से अधिक उपयोगी है।


4

अपनी कक्षाओं के लिए उपयोगी repr () विधियों को परिभाषित करना (ताकि आप देख सकें कि कोई वस्तु क्या है) और repr () या "% r"% (...) या "... {0-r} .." का उपयोग करके। (...) आपके डिबग संदेशों / लॉग में IMHO कुशल डिबगिंग की कुंजी है।

साथ ही, अन्य उत्तरों में उल्लिखित डीबगर्स रीप () विधियों का उपयोग करेंगे ।


2

चल रहे पायथन एप्लिकेशन से स्टैक ट्रेस करना

यहां कई तरकीबें हैं । इसमें शामिल है

  • एक दुभाषिया में तोड़ना / एक संकेत भेजकर स्टैक ट्रेस को प्रिंट करना
  • एक ढेर पायथन प्रक्रिया से बाहर एक स्टैक ट्रेस हो रही है
  • डिबगिंग के लिए उपयोगी बनाने के लिए झंडे के साथ दुभाषिया चलाना

2

यदि आपको डिबगर में समय बिताना पसंद नहीं है (और pdbकमांड लाइन इंटरफ़ेस की खराब उपयोगिता की सराहना नहीं करते हैं ), तो आप निष्पादन ट्रेस को डंप कर सकते हैं और बाद में इसका विश्लेषण कर सकते हैं । उदाहरण के लिए:

python -m trace -t setup.py install > execution.log

यह setup.py installनिष्पादन के सभी स्रोत लाइन को डंप कर देगा execution.log

ट्रेस आउटपुट को अनुकूलित करना और अपने स्वयं के ट्रैवर्स को लिखना आसान बनाने के लिए, मैंने कोड के कुछ टुकड़ों को xtrace मॉड्यूल (सार्वजनिक डोमेन) में डाल दिया ।


1

जब संभव हो, मैं M-x pdbस्रोत स्तर डिबगिंग के लिए emacs में उपयोग कर डिबग करता हूं ।


1

उडेसिटी पर एंड्रियास ज़ेलर द्वारा " सॉफ्टवेयर डिबगिंग " नामक एक पूर्ण ऑनलाइन पाठ्यक्रम है , जो डिबगिंग के बारे में युक्तियों से भरा है:

कोर्स का सारांश

इस कक्षा में आप सीखेंगे कि प्रोग्राम को व्यवस्थित रूप से कैसे डिबग करें, कैसे डिबगिंग प्रक्रिया को स्वचालित करें और पायथन में कई स्वचालित डीबगिंग टूल का निर्माण करें।

यह पाठ्यक्रम क्यों लें?

इस पाठ्यक्रम के अंत में आपको व्यवस्थित डिबगिंग के बारे में एक ठोस समझ होगी, डिबगिंग को स्वचालित करने का तरीका जानेंगे और पायथन में कई कार्यात्मक डिबगिंग टूल बनाए होंगे।

आवश्यकताएँ और आवश्यकताएँ

उडासिटी CS101 के स्तर पर प्रोग्रामिंग और पायथन के बुनियादी ज्ञान या बेहतर की आवश्यकता है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की बुनियादी समझ मददगार है।

अत्यधिक सिफारिशित।


0

यदि आप एक पठनीय शैली में अपने कॉल स्टैक को प्रिंट करने के लिए एक अच्छा चित्रमय तरीका चाहते हैं, तो इस उपयोगिता को देखें: https://github.com/joerick/pyinstrument

कमांड लाइन से चलाएं:

python -m pyinstrument myscript.py [args...]

मॉड्यूल के रूप में चलाएं:

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# code you want to profile

profiler.stop()
print(profiler.output_text(unicode=True, color=True))

Django के साथ चलाएं:

बस जोड़ने pyinstrument.middleware.ProfilerMiddlewareके लिए MIDDLEWARE_CLASSESहै, तो जोड़ने ?profileप्रोफाइलर सक्रिय करने के लिए अनुरोध URL के अंत में।

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