Was ist der richtige Weg, um in iPython Notebook zu debuggen?


121

Wie ich weiß, %debug magickann Debugging in einer Zelle durchgeführt werden.

Ich habe jedoch Funktionsaufrufe über mehrere Zellen hinweg.

Beispielsweise,

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 versucht habe:

  1. Ich habe versucht, %debugin die erste Zeile von Zelle 1 zu setzen. Es wechselt jedoch sofort in den Debug-Modus, noch bevor Zelle 2 ausgeführt wird.

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

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

Antworten:


72

Verwenden Sie ipdb

Installieren Sie es über

pip install ipdb

Verwendung:

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)

Zum zeilenweisen Ausführen und zum Einsteigen nin eine Funktion verwenden sund die Verwendung der Debugging-Eingabeaufforderung beenden c.

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


ipdb gibt mir nicht die Debug-Eingabeaufforderung in der anderen Zelle mit dem in der Frage genannten Beispielcode. Jetzt läuft der Code für immer weiter.
Rex

@ Rex Für mich funktioniert es. Wo hast du ipdb hingelegt? Put import ipdb; ipdb.set_trace (); vor der Zeile do_some_thing_about (b) zurückgeben. Rufen Sie dann fun1 (a) aus der zweiten Zelle auf, es sollte funktionieren. Zum Verlassen des Debugging-Promts verwenden Sie 'c'
Tevin Joseph KO

@Rex Die Antwort wurde für mehr Klarheit aktualisiert.
Tevin Joseph KO

29
Dies funktioniert in der iPython-Konsole, jedoch nicht im iPython-Notebook (was in der Frage gestellt wird). Wenn ich import ipdb; ipdb.set_trace()in eine Notizbuchzelle tippe, heißt esMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
neu bei jupyter ... es scheint, dass es besser für die Präsentation und das Teilen von Codefragmenten geeignet ist ... können wir Funktionen haben, die IDEs (wie Eclipse, rstudio) bieten, wie das tatsächliche Debuggen, Durchgehen, Haltepunkte, Hinzufügen von Watch zum Ausdruck und Variablen usw. Auf den ersten
Blick

90

Sie können ipdbinside jupyter verwenden mit:

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

Bearbeiten : Die oben genannten Funktionen sind seit IPython 5.1 veraltet. Dies ist der neue Ansatz:

from IPython.core.debugger import set_trace

Fügen set_trace()Sie hinzu, wo Sie einen Haltepunkt benötigen. Geben Sie helpfür ipdbBefehle ein, wenn das Eingabefeld angezeigt wird.


20
Tracerwurde abgeschrieben. Jetzt funktioniert es so: from IPython.core.debugger import set_traceund set_trace()ruft einen Haltepunkt hervor. Quelle: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
Praktisch als eine Zeile zu verwenden, wo immer benötigt:from IPython.core.debugger import set_trace;set_trace()
Nir

15

Ihre Rückgabefunktion steht in der Zeile der Def-Funktion (Hauptfunktion), Sie müssen ihr eine Registerkarte zuweisen. Und verwenden

%%debug 

anstatt

%debug 

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


12

Sie können dies jederzeit in eine beliebige Zelle einfügen:

import pdb; pdb.set_trace()

und der Debugger stoppt in dieser Zeile. Beispielsweise:

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

In[2]: fun1(1)

Sollte das ipdb sein?
Rex

1
@ Rex Nicht unbedingt. ipdbist ein Refactor des Python-Debuggers, der enger in IPython integriert ist. pdbist eingebaut.
Zwei-Bit-Alchemist

ipdbkann auch außerhalb der ipython-Shell verwendet werden und bietet einige Annehmlichkeiten wie das Ausfüllen von Registerkarten.
Jan

12

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

breakpoint()

Überall dort, wo die Laufzeit angehalten werden soll, können Sie von dort aus dieselben pdb-Befehle (r, c, n, ...) verwenden oder Ihre Variablen auswerten.


2
Wenn Sie breakpoint () aufrufen, können Sie außerdem in das angezeigte Textfeld 'help' eingeben, um eine Liste der Befehle anzuzeigen.
Gbeaven

Nach der Verwendung von breakpoint () oder pdb scheint es ein anhaltendes Problem beim Auflegen zu geben: github.com/ipython/ipython/issues/10516
Dave Liu

8

import pdbGeben Sie einfach das Jupyter-Notizbuch ein und verwenden Sie dieses Cheatsheet zum Debuggen. Es ist sehr praktisch.

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

Einige nützliche Links: Python Official Document on pdb , Beispiele für Python pdb-Debugger zum besseren Verständnis der Verwendung der Debugger-Befehle .

Einige nützliche Screenshots: Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein


Gute Antwort. Ich denke jedoch (ich bin neu in Jupyter Notebook), dass man% debug hinzufügen sollte, um einen Haltepunkt zu setzen.
Ad Infinitum

Was ich mache, ist kopieren und einfügen pdb.set_trace(), wo ich einen Haltepunkt setzen möchte, da das b line_noin Jupyter Notebook nicht funktioniert und gut mit Python IDLE funktioniert.
Flowera

Vielen Dank! Ich habe auch einige Screenshots hochgeladen, die ich heute getestet habe. Wenn ich zu Python IDLE wechseln könnte, würde ich das gerne tun.
Flowera

Außerdem finde ich eine Möglichkeit, die Zeilennummer auf dem Jupiter-Notizbuch anzuzeigen, auf Neue Zeile zu klicken und dann l zu drücken. Natürlich können Sie auch Ihre eigene Verknüpfung programmieren. Links finden Sie auf der Website des Jupyter-Notizbuchs.
Flowera

1
Ich benutze immer "p", um die Liste der Befehle im Jupyter-Notizbuch anzuzeigen. Wenn ich "Zeilennummern anzeigen" schreibe, wird dort der Befehl mit der Verknüpfung daneben angezeigt. Sie können auch die Verknüpfung des Befehls lernen, den Sie verwenden möchten.
Ad Infinitum

8

Nachdem Sie eine Fehlermeldung erhalten haben, führen Sie sie in der nächsten Zelle aus %debugund fertig.


1
das ist fantastisch!
Jemand

Dies muss jedoch warten, bis die Ausnahme auftritt. Möglicherweise möchten wir die Variable in der Laufzeit testen, indem wir einen Haltepunkt
Luk Aron

7

Der %pdbmagische Befehl ist auch gut zu benutzen. Sagen Sie einfach %pdb onund anschließend wird der pdbDebugger mit allen Ausnahmen ausgeführt, egal wie tief im Aufrufstapel. Sehr praktisch.

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


5

Ich habe gerade PixieDebugger entdeckt . Obwohl ich noch keine Zeit hatte, es zu testen, scheint es wirklich die ähnlichste Art zu sein, die Art und Weise zu debuggen, wie wir sie in ipython mit ipdb verwenden

Geben Sie hier die Bildbeschreibung ein

Es hat auch eine Registerkarte "Auswerten"


0

Ein nativer Debugger wird als Erweiterung für JupyterLab zur Verfügung gestellt. Vor einigen Wochen veröffentlicht, kann dies installiert werden, indem die entsprechende Erweiterung sowie der xeus-python-Kernel abgerufen werden (der insbesondere ohne die den ipykernel-Benutzern bekannten Magie auskommt):

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

Dies ermöglicht ein visuelles Debugging-Erlebnis, das von anderen IDEs bekannt ist.

Geben Sie hier die Bildbeschreibung ein

Quelle: Ein visueller Debugger für Jupyter


xeus-python läuft nicht unter Windows 10. Überprüfen Sie mein Problem xeus-python-Problem auf github
sergzemsk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.