IPython नोटबुक में डिबग करने का सही तरीका क्या है?


121

जैसा कि मुझे पता है, %debug magicएक सेल के भीतर डिबग कर सकते हैं।

हालाँकि, मेरे पास कई सेल में फ़ंक्शन कॉल हैं।

उदाहरण के लिए,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

मैंने क्या कोशिश की:

  1. मैंने %debugसेल -1 की पहली पंक्ति में स्थापित करने की कोशिश की । लेकिन यह सेल -2 को निष्पादित करने से पहले ही तुरंत डिबग मोड में प्रवेश कर जाता है।

  2. मैंने %debugकोड से ठीक पहले लाइन में जोड़ने की कोशिश की return do_some_thing_about(b)। लेकिन फिर कोड हमेशा के लिए चलता है, कभी नहीं रुकता।

IPython नोटबुक के भीतर एक विराम बिंदु सेट करने का सही तरीका क्या है?

जवाबों:


72

Ipdb का प्रयोग करें

इसके माध्यम से स्थापित करें

pip install ipdb

उपयोग:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

लाइन उपयोग द्वारा लाइन निष्पादित करने के लिए nऔर फ़ंक्शन उपयोग में कदम के लिए sऔर डीबगिंग प्रॉम्प्ट उपयोग से बाहर निकलने के लिए c

उपलब्ध आदेशों की पूरी सूची के लिए: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


प्रश्न में उल्लिखित नमूना कोड के साथ ipdb मुझे अन्य सेल में डिबग प्रॉम्प्ट नहीं देता है। अब कोड हमेशा चलता रहता है।
रेक्स

@ मेरे लिए काम करता है। आपने ipdb कहाँ लगाया? आयात ipdb डालें; ipdb.set_trace (); लाइन से पहले do_some_thing_about (b) लौटें। फिर, दूसरी सेल से fun1 (ए) को कॉल करें, यह काम करना चाहिए। डीबगिंग प्रोमट उपयोग 'सी' से बाहर निकलने के लिए
टीविन जोसेफ कोओ

@Rex अधिक स्पष्टता के लिए उत्तर अपडेट किया गया।
तविन जोसेफ कोए

29
यह iPython कंसोल में काम करता है लेकिन iPython नोटबुक में नहीं है (जो कि प्रश्न पूछा गया है)। जब मैं import ipdb; ipdb.set_trace()एक नोटबुक सेल में टाइप करता हूं तो यह कहता हैMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
बिल

1
ज्यूपिटर के लिए नया ... ऐसा लगता है कि यह प्रस्तुति और कोड स्निपेट्स साझा करने के लिए अधिक उपयुक्त है ... क्या हमारे पास कार्यक्षमता हो सकती है कि आईडीई (जैसे ग्रहण, rstudio) वास्तविक डिबगिंग, स्टेप थ्रू, ब्रेकपॉइंट, अभिव्यक्ति में घड़ी जोड़कर और प्रदान करें चर आदि। सबसे पहले, ऐसा लगता है कि यह मामला नहीं है, बस यकीन करना चाहते हैं .....
महेसा 999

90

आप ipdbअंदर ज्यूपिटर का उपयोग कर सकते हैं :

from IPython.core.debugger import Tracer; Tracer()()

संपादित करें : ऊपर दिए गए कार्य IPython 5.1 के बाद से हटाए गए हैं। यह नया तरीका है:

from IPython.core.debugger import set_trace

set_trace()आपको एक ब्रेकपॉइंट की आवश्यकता है जहां जोड़ें । इनपुट फ़ील्ड दिखाई helpदेने पर ipdbकमांड के लिए टाइप करें ।


20
Tracerमूल्यह्रास किया गया था। अब यह इस तरह से काम करता है: from IPython.core.debugger import set_traceऔर set_trace()एक ब्रेकपॉइंट को विकसित करता है। स्रोत: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
एंटोन

1
जहां भी जरूरत हो, एक पंक्ति के रूप में उपयोग करने के लिए आसान:from IPython.core.debugger import set_trace;set_trace()
नीर

15

आपका रिटर्न फंक्शन डिफेंस फंक्शन (मेन फंक्शन) की कतार में है, आपको एक टैब देना होगा। और उपयोग करें

%%debug 

के बजाय

%debug 

पूरे सेल को डिबग करने के लिए न केवल लाइन। आशा है, शायद यह आपकी मदद करेगा।


12

आप इसे किसी भी सेल में हमेशा जोड़ सकते हैं:

import pdb; pdb.set_trace()

और डिबगर उस लाइन पर रुक जाएगा। उदाहरण के लिए:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

कि ipdb होना चाहिए?
रेक्स

1
@Rex जरूरी नहीं है। ipdbपाइथन डीबगर का एक रिफ्लेक्टर है जो आईपीथॉन के साथ अधिक निकटता से जुड़ा हुआ है। pdbमें बनाया गया है।
दो-बिट अल्केमिस्ट

ipdbभी ipython खोल के बाहर इस्तेमाल किया जा सकता है और टैब पूरा होने जैसी कुछ उपयुक्तता के साथ आता है।
Jan

12

पायथॉन 3.7 में आप ब्रेकपॉइंट () फ़ंक्शन का उपयोग कर सकते हैं । बस दर्ज करें

breakpoint()

आप जहाँ भी रुकना चाहेंगे और वहाँ से आप उसी pdb कमांड (r, c, n, ...) का उपयोग कर सकते हैं या अपने चर का मूल्यांकन कर सकते हैं।


2
इसे जोड़ने के लिए, जब आप ब्रेकपॉइंट कहते हैं (), तो आप टेक्स्ट बॉक्स में 'सहायता' टाइप कर सकते हैं जो कमांड की सूची प्राप्त करने के लिए प्रकट होता है।
gbeaven

ब्रेकपॉइंट () या pdb: github.com/ipython/ipython/issues/10516
डेव लियू

8

बस टाइप import pdbjupyter नोटबुक में, और उसके बाद इस का उपयोग cheatsheet डिबग करने के लिए। यह बहुत सुविधाजनक है।

c-> जारी है, s-> कदम, b 12-> 12 और इतने पर लाइन ब्रेक सेट।

कुछ उपयोगी लिंक: pdb पर पायथन ऑफिशियल डॉक्यूमेंट , पायथन pdb डिबगर बेहतर डिबगर कमांड का उपयोग कैसे करें, बेहतर समझ के लिए उदाहरण

कुछ उपयोगी स्क्रीनशॉट: यहाँ छवि विवरण दर्ज करेंयहाँ छवि विवरण दर्ज करें


अच्छा उत्तर। हालांकि, मुझे लगता है कि (मैं ज्यूपिटर नोटबुक के लिए नया हूं) एक को ब्रेकपॉइंट सेट करने के लिए% डीबग को जोड़ना चाहिए।
विज्ञापन इनफिनिटम

मैं जो भी करता हूं उसे कॉपी और पेस्ट pdb.set_trace()करता हूं जहां मैं एक ब्रेकपॉइंट सेट करना चाहता हूं, क्योंकि b line_noजुपिटर नोटबुक में काम नहीं कर रहा है और अजगर आईडीएल पर अच्छी तरह से काम करता है।
फूलका

धन्यवाद! मैंने कुछ स्क्रीनशॉट भी अपलोड किए हैं जिन्हें मैंने आज परीक्षण किया है। अगर मैं अजगर
आईडीएल

इसके अलावा, मैं ज्यूपिटर नोटबुक पर लाइन नंबर दिखाने का एक तरीका ढूंढता हूं, नई लाइन पर क्लिक करता हूं, और फिर एल दबाता हूं। बेशक आप अपने शॉर्टकट को भी प्रोग्राम कर सकते हैं, लिंक ज्यूपिटर नोटबुक वेबसाइट पर उपलब्ध हैं।
19

1
मैं ज्यूपिटर नोटबुक में कमांड की सूची दिखाने के लिए हमेशा "पी" का उपयोग करता हूं। जब मैं "शो लाइन नंबर" लिखता हूं, तो कमांड वहां दिखाई देता है जो उसके बगल में स्थित शार्टकट को दिखाता है। आप कमांड का शॉर्टकट भी सीख सकते हैं, जिसे आप उपयोग करना चाहते हैं।
विज्ञापन इनफिनिटम

8

आपके द्वारा एक त्रुटि प्राप्त करने के बाद, अगले कक्ष में बस चलता है %debugऔर बस ।


1
यह बहुत अच्छा है!
किसी

हालाँकि, इसके अपवाद होने की प्रतीक्षा करनी चाहिए, हम यह परखना चाहते हैं कि कुछ ब्रेकपॉइंट सेट करके रनटाइम में वैरिएबल क्या है
ल्यूक एरोन

7

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

यदि आपके पास एक विशेष पंक्ति है जिसे आप डीबग करना चाहते हैं, तो बस वहां एक अपवाद बढ़ाएं (अक्सर आप पहले से ही हैं!) या उस %debugजादू कमांड का उपयोग करें जिसे अन्य लोग सुझाव दे रहे हैं।


5

मैंने अभी पिक्सीडेबगर की खोज की है । यहां तक ​​कि सोचा कि मेरे पास अभी तक इसका परीक्षण करने का समय नहीं है, यह वास्तव में आईपीडीबी के साथ आईपीथॉन में उपयोग किए जाने वाले तरीके को डिबग करने का सबसे समान तरीका लगता है।

यहाँ छवि विवरण दर्ज करें

इसमें "मूल्यांकन" टैब भी है


0

एक देशी डिबगर को जुपिटरलैब के विस्तार के रूप में उपलब्ध कराया जा रहा है। कुछ हफ़्ते पहले जारी किया गया था, इसे संबंधित एक्सटेंशन, और साथ ही xeus-python कर्नेल द्वारा प्राप्त किया जा सकता है (जो कि जादूगरों के जाने-माने उपयोगकर्ताओं के बिना आता है):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

यह एक दृश्य डिबगिंग अनुभव को अन्य आईडीई से अच्छी तरह से परिचित करने में सक्षम बनाता है।

यहाँ छवि विवरण दर्ज करें

स्रोत: जुपिटर के लिए एक दृश्य डिबगर


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