it-swarm.com.de

Was ist der richtige Weg zum Debuggen in einem iPython-Notebook?

Wie ich weiß, kann %debug magic innerhalb einer Zelle debuggen.

Ich habe jedoch Funktionsaufrufe über mehrere Zellen hinweg.

Zum Beispiel,

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

Was ich probiert habe: 

  1. Ich habe versucht, %debug in der ersten Zeile von Zelle-1 festzulegen. Es tritt jedoch sofort in den Debug-Modus ein, sogar bevor Zelle 2 ausgeführt wird. 

  2. Ich habe versucht, %debug in die Zeile direkt vor dem Code return do_some_thing_about(b) einzufügen. Aber dann läuft der Code für immer und hört nie auf.

Was ist der richtige Weg, um einen Haltepunkt im ipython-Notebook festzulegen?

89
Rex

Verwenden Sie ipdb

Installieren Sie es über

pip install ipdb

Verwendungszweck:

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)

Zur zeilenweisen Ausführung verwenden n und für den Einstieg in eine Funktion verwenden s und um das Debuggen zu beenden, verwenden Sie Prompt c.

Eine vollständige Liste der verfügbaren Befehle finden Sie hier: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf

60

Sie können ipdb in Jupyter verwenden mit:

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


Edit : Die oben genannten Funktionen werden seit IPython 5.1 nicht mehr unterstützt. Dies ist der neue Ansatz:

from IPython.core.debugger import set_trace

Fügen Sie set_trace() hinzu, wo Sie einen Haltepunkt benötigen. Geben Sie help für ipdb-Befehle ein, wenn das Eingabefeld angezeigt wird.

81
Leopd

Ihre Rückgabefunktion ist in der Zeile def (Hauptfunktion), Sie müssen eine Registerkarte angeben .. und verwenden 

%%debug 

anstatt

%debug 

die ganze Zelle nicht nur Zeile zu debuggen. Hoffe, vielleicht hilft dir das.

11
Mohit Khurana

Sie können dies jederzeit in jeder Zelle hinzufügen:

import pdb; pdb.set_trace()

der Debugger wird in dieser Zeile angehalten. Zum Beispiel:

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

In[2]: fun1(1)
8
krock

Geben Sie einfach import pdb in das Jupyter-Notizbuch ein und verwenden Sie dann dieses Cheatsheet zum Debuggen. Das ist sehr praktisch.

c -> weiter, s -> Schritt, b 12 -> Haltepunkt in Zeile 12 setzen usw.

Einige nützliche Links: Offizielles Python-Dokument zu pdb , Python pdb-Debugger-Beispiele zum besseren Verständnis der Verwendung der Debugger-Befehle .

Einige nützliche Screenshots: enter image description here enter image description here

6
flowera

Der magische Befehl %pdb ist auch gut zu verwenden. Sagen Sie einfach %pdb on und anschließend wird der pdb-Debugger mit allen Ausnahmen ausgeführt, unabhängig davon, wie tief der Aufrufstack ist. Sehr praktisch.

Wenn Sie eine bestimmte Zeile haben, die Sie debuggen möchten, lösen Sie dort einfach eine Ausnahme aus (oft sind Sie bereits!) Oder verwenden Sie den %debug-Befehl, den andere Leute vorgeschlagen haben.

4
waterproof

In Python 3.7 können Sie die Funktion breakpoint () verwenden. Einfach eintreten 

breakpoint()

wo immer Sie die Laufzeit stoppen möchten und von dort aus dieselben pdb-Befehle verwenden können (r, c, n, ...) oder Ihre Variablen auswerten.

2
Vlad Bezden

Nachdem Sie einen Fehler erhalten haben, führen Sie in der nächsten Zelle einfach %debug aus.

2
Escachator

Ich habe gerade PixieDebugger entdeckt. Auch wenn ich noch nicht die Zeit hatte, um es zu testen, scheint es der ähnlichste Weg zu sein, die Art und Weise zu debuggen, wie wir sie in ipython mit ipdb verwenden

 enter image description here

Es hat auch eine "auswerten" Registerkarte

0