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



Answers

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

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

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

python -m pudb.run my-script.py
Question

पाइथन डीबग करने के लिए आपकी सबसे अच्छी युक्तियाँ क्या हैं?

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

सम्बंधित




लॉगिंग

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

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

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

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

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

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

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

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






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

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, एक ठोस ग्राफिकल डीबगर के साथ किया जा सकता है। क्योंकि मुझे पता है कि आप पूछेंगे, यह सब कुछ कर सकता है जो मुझे ग्राफिकल डीबगर करने की उम्मीद है :)

मैं nose.tools से nose.tools उपयोग करता हूं ताकि मैं यूनिट परीक्षणों के साथ-साथ सामान्य कोड डीबग कर nose.tools

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




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

यहां कई चालें here । इसमें शामिल है

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



आईपीडीबी आईपीथॉन की उत्कृष्टता के साथ पीडीबी की तरह है।




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




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

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

यदि आप नहीं जानते कि वह स्क्रिप्ट कहां है

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



यदि आप अपने कॉल स्टैक को एक पठनीय फैशन में प्रिंट करने के लिए एक अच्छा ग्राफिकल तरीका चाहते हैं, तो इस उपयोगिता को देखें: 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 के अंत में ?profile जोड़ें।




Links