डिबग मुद्दों की सहायता के लिए पायथन कोड के माध्यम से कदम कैसे उठाया जाए?


185

जावा / सी # में आप आसानी से पता लगाने के लिए कोड के माध्यम से कदम उठा सकते हैं कि क्या गलत हो सकता है, और आईडीई इस प्रक्रिया को बहुत उपयोगकर्ता के अनुकूल बनाता है।

क्या आप इसी तरह से अजगर कोड के माध्यम से पता लगा सकते हैं?

जवाबों:


262

हाँ! वहाँ एक पायथन डिबगर कहा जाता है pdbकि बस करने के लिए!

आप pdbका उपयोग करके pdb myscript.pyया के माध्यम से एक पायथन कार्यक्रम लॉन्च कर सकते हैं python -m pdb myscript.py

कुछ आदेश हैं जिन्हें आप तब जारी कर सकते हैं, जो pdbपृष्ठ पर प्रलेखित हैं ।

याद रखने के लिए कुछ उपयोगी हैं:

  • b: एक ब्रेकपॉइंट सेट करें
  • c: तब तक डिबगिंग जारी रखें जब तक कि आप एक ब्रेकपॉइंट नहीं मारते
  • s: कोड के माध्यम से कदम
  • n: कोड की अगली पंक्ति में जाने के लिए
  • l: वर्तमान फ़ाइल के लिए सूची स्रोत कोड (डिफ़ॉल्ट: 11 लाइनों को निष्पादित किया जा रहा है सहित)
  • u: स्टैक फ्रेम को नेविगेट करें
  • d: एक स्टैक फ्रेम नीचे नेविगेट करें
  • p: वर्तमान संदर्भ में एक अभिव्यक्ति के मूल्य को मुद्रित करने के लिए

यदि आप कमांड लाइन डिबगर का उपयोग नहीं करना चाहते हैं, तो कुछ IDEs जैसे Pydev , Wing IDE या PyCharm में GUI डीबगर है। विंग और PyCharm वाणिज्यिक उत्पाद हैं, लेकिन विंग का एक "व्यक्तिगत" संस्करण है, और PyCharm का एक निःशुल्क सामुदायिक संस्करण है।


10
वाह, मैं विश्वास नहीं कर सकता कि मैं एक कठिन समय linux / ubuntu के लिए एक चित्रमय पीडीडीबी पा रहा हूँ। क्या मैं कुछ भूल रहा हूँ? मुझे इसके लिए एक SublimeText Plugin बनाने पर ध्यान देना होगा।
थोरसुमोनर

4
PyCharm एक चित्रमय डिबगर के रूप में बहुत अच्छा है, और इसका सामुदायिक संस्करण मुफ़्त है!
पीटर

@ थोरसुमोनर, इसके pudbलिए बहुत अच्छा है। इसके अलावाpydev
अल्फा_

pdbकमांड लाइन टूल नहीं है। इसका उपयोग करने के लिए, का उपयोग करें python -m pdb your_script.py
jdhao

@ झाड़ो मुझे लगता है कि यह मानक नहीं है, लेकिन उबंटू पर pdbकमांड pythonपैकेज का हिस्सा है । किसी भी मामले में, python -m <module>अन्य चीजों के लिए भी मानक बन रहा है pip, इसलिए संभवत: डिफ़ॉल्ट रूप से इसका उपयोग करना सबसे अच्छा है।
wjandrea

55

पायथन इंटरएक्टिव डीबगर 'पीडीबी' का उपयोग करके

पहला कदम पायथन इंटरप्रेटर को डिबगिंग मोड में प्रवेश करने के लिए बनाना है।

A. कमांड लाइन से

सबसे सीधा आगे रास्ता, कमांड लाइन से चल रहा है, अजगर दुभाषिया का

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

इंटरप्रेटर के भीतर बी

मॉड्यूल के शुरुआती संस्करणों को विकसित करते हुए और इसे और अधिक प्रयोग करने के लिए।

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

अपने कार्यक्रम के भीतर से सी

एक बड़े प्रोजेक्ट और लंबे समय तक चलने वाले मॉड्यूल के लिए, आयात pdb और set_trace () का उपयोग करके प्रोग्राम के अंदर से डिबगिंग शुरू कर सकते हैं :

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __name__ == '__main__':
    MyObj(5).go()

अधिक आंतरिक में जाने के लिए चरण-दर-चरण डिबगिंग

  1. "N" (अगला) के साथ अगला कथन निष्पादित करें ...

  2. अंतिम डिबगिंग कमांड को दोहराया जा रहा है ... ENTER के साथ

  3. यह सब छोड़ ... "क्ष" (छोड़ें) के साथ

  4. "पी" (प्रिंट) के साथ चर के मूल्य को प्रिंट करना ...

    a) पा

  5. (Cdb) प्रॉम्प्ट को "c" (जारी) के साथ बंद करना

  6. "L" (सूची) के साथ आप कहां हैं ...

  7. "एस" (चरण में) के साथ सबरूटीन्स में कदम रखना ...

  8. जारी है ... लेकिन बस वर्तमान सबरूटीन के अंत तक ... "आर" (वापसी) के साथ

  9. एक नया मान निर्दिष्ट करें

    a) ! b = "B"

  10. एक ब्रेकपॉइंट सेट करें

    a) लिननम्बर को तोड़ें

    ख) फंक्शननामे तोड़ें

    सी) फ़ाइल नाम: लिननम्बर

  11. अस्थायी ब्रेकपॉइंट

    ए) ट्रेंक लिननम्बर

  12. सशर्त विराम

    क) लिननम्बर, स्थिति को तोड़ दें

नोट: ** इन सभी कमांड को ** pdb से निष्पादित किया जाना चाहिए

गहन ज्ञान के लिए, देखें: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/


41

अजगर में 'pdb' नामक एक मॉड्यूल होता है। अपने अजगर स्क्रिप्ट के शीर्ष पर आप करते हैं

import pdb
pdb.set_trace()

और आप डिबगिंग मोड में प्रवेश करेंगे। आप 's' को स्टेप, 'n' के साथ अगली पंक्ति का अनुसरण करने के लिए उपयोग कर सकते हैं, जो आप 'gdb' डिबगर के साथ करेंगे।


21

पायथन 3.7 में शुरू, आप breakpoint()डिबगर में प्रवेश करने के लिए अंतर्निहित फ़ंक्शन का उपयोग कर सकते हैं :

foo()
breakpoint()  # drop into the debugger at this point
bar()

डिफ़ॉल्ट रूप से, breakpoint()आयात pdbऔर कॉल करेगा pdb.set_trace()। हालाँकि, आप sys.breakpointhook()पर्यावरण चर के माध्यम से डिबगिंग व्यवहार को नियंत्रित कर सकते हैं PYTHONBREAKPOINT

अधिक जानकारी के लिए पीईपी 553 देखें ।


2
जब मैंने देखा तो breakpointमैं उत्साहित था। लेकिन तब मुझे पता चला कि यह अनिवार्य रूप से सिर्फ एक शॉर्टकट है import pdb; pdb.set_trace()और इसने मुझे दुखी किया है। पायथन देव: कृपया संदर्भ लाइनों, लगातार कमांड इतिहास और टैब ऑटो पूरा करने जैसी बुनियादी GDB सुविधाओं के साथ PDB को बेहतर बनाने पर ध्यान केंद्रित करें :-)
Ciro Santilli 郝海东 冠状 病 '21

11

ipdb (IPython डिबगर)

ipdb निम्नलिखित बड़ी सुधार की पेशकश करते हुए pdb में IPython कार्यक्षमता जोड़ता है:

  • टैब पूरा करना
  • अधिक संदर्भ लाइनें दिखाएं
  • वाक्य रचना पर प्रकाश डाला

Pdg की तरह, ipdb अभी भी GDB की तुलना में एकदम सही और पूरी तरह से अल्पविकसित है, लेकिन यह पहले से ही pdb पर बहुत बड़ा सुधार है।

उपयोग के अनुरूप है pdb, बस इसे स्थापित करें:

python3 -m pip install --user ipdb

और फिर उस पंक्ति में जोड़ें जिससे आप डीबग करना चाहते हैं:

__import__('ipdb').set_trace(context=21)

आप अपने संपादक से इसके लिए एक शॉर्टकट जोड़ना चाहते हैं, उदाहरण के लिए विम स्निपमेट मेरे पास:

snippet ipd
    __import__('ipdb').set_trace(context=21)

इसलिए मैं सिर्फ टाइप कर सकता हूं ipd<tab>और यह ब्रेकपॉइंट तक फैलता है। फिर इसे हटाना आसान है ddक्योंकि सब कुछ एक ही पंक्ति में समाहित है।

context=21संदर्भ लाइनों की संख्या में वृद्धि के रूप में समझाया गया है: मैं डीबग करते समय संदर्भ की अधिक पंक्तियां कैसे दिखा सकता हूं?

वैकल्पिक रूप से, आप शुरू से ही प्रोग्राम डिबग भी कर सकते हैं:

ipdb3 main.py

लेकिन आप आम तौर पर ऐसा नहीं करना चाहते क्योंकि:

  • पाइथन की उन पंक्तियों को पढ़ते हुए आपको सभी फ़ंक्शन और क्लास परिभाषाओं से गुजरना होगा
  • मुझे नहीं पता कि आईपीडीबी को हैक किए बिना वहां संदर्भ आकार कैसे सेट किया जाए। पैच इसे अनुमति देने के लिए: https://github.com/gotcha/ipdb/pull/155

या वैकल्पिक रूप से, कच्चे pdb 3.2+ की तरह आप कमांड लाइन से कुछ ब्रेकप्वाइंट सेट कर सकते हैं:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

हालांकि -c cकिसी कारण से टूट गया है: https://github.com/gotcha/ipdb/issues/156

python -m moduleडिबगिंग में पूछा गया है: कमांड लाइन से अजगर -m के साथ चलने वाले पायथन मॉड्यूल को कैसे डिबग करें? और जब से Python 3.7 के साथ किया जा सकता है:

python -m pdb -m my_module

GDB की तुलना में pdb और ipdb दोनों की गंभीर गायब विशेषताएँ:

ipdb विशिष्ट झुंझलाहट:

उबंटू 16.04, ipdb == 0.11, पायथन 3.5.2 में परीक्षण किया गया।



3

यदि आप Java / C # बैकग्राउंड से आते हैं, तो मुझे लगता है कि आपका सबसे अच्छा शर्त है कि आप Pydev के साथ ग्रहण का उपयोग करेंगे । यह आपको पूरी तरह से कार्यात्मक आईडीई देता है जिसमें निर्मित डिबगर है। मैं इसे डिंगो के साथ भी उपयोग करता हूं।




2

पायथन ट्यूटर नौसिखियों के लिए एक ऑनलाइन एकल-कदम डिबगर है। आप एडिट पेज पर कोड डाल सकते हैं और फिर इसे चालू करने के लिए "विज़ुअलाइज़ एक्सक्यूशन" पर क्लिक करें।

अन्य बातों के अलावा, यह समर्थन करता है:

हालाँकि, यह बहुत सी चीज़ों का समर्थन नहीं करता है , उदाहरण के लिए:

  • फ़ाइलों को पढ़ना / लिखना - उपयोग करना io.StringIOऔर io.BytesIOइसके बजाय: डेमो
  • कोड जो बहुत बड़ा है, बहुत लंबा चलता है, या बहुत से चर या वस्तुओं को परिभाषित करता है
  • कमांड-लाइन तर्क
  • मानक पुस्तकालय मॉड्यूल, जैसे argparse, csv, enum, html, os, संरचना, कमजोर ...

1

पायथन कोड के माध्यम से प्रोग्रामिंग स्टेपिंग और ट्रेसिंग भी संभव है (और इसके आसान!)। को देखो sys.settrace () अधिक जानकारी के लिए प्रलेखन। यहां भी आपको शुरू करने के लिए एक ट्यूटोरियल है।



1

PyCharm पायथन के लिए एक IDE है जिसमें एक डीबगर शामिल है। कोड के माध्यम से कदम रखने के लिए PyCharm के डिबगर का उपयोग करने पर एक परिचय के लिए यह YouTube वीडियो देखें।

PyCharm ट्यूटोरियल - PyCharm का उपयोग करके अजगर कोड को डीबग करें

नोट: यह एक समर्थन या समीक्षा करने का इरादा नहीं है। PyCharm एक व्यावसायिक उत्पाद है जिसे किसी को भुगतान करने की आवश्यकता होती है, लेकिन कंपनी छात्रों और शिक्षकों को एक मुफ्त लाइसेंस प्रदान करती है, साथ ही एक "हल्का" सामुदायिक संस्करण भी है जो स्वतंत्र और खुला-स्रोत है।

स्क्रीनशॉट

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