2012-09-28 6 views
29

Gibt es eine Möglichkeit, in die erste Zeile einer Funktion in ipython zu gelangen. Ich stelle mir vor etwas, das wie folgt aussehen würde:In eine Funktion in IPython einsteigen

%step foo(1, 2) 

die ipdb verläuft und setzt einen Haltepunkt an der ersten Zeile des foo.

Wenn ich das jetzt tun möchte, muss ich zum Quellcode der Funktion gehen und eine import ipdb; ipdb.set_trace() Zeile hinzufügen.

+1

Es gibt keine Funktion wie '% step'. Sie können '% run -d' ein ganzes Skript ausführen, aber Sie können nicht dasselbe für eine einzelne Anweisung oder einen Funktionsaufruf tun. Sie können manuell 'pdb.run (" foo (1, 2) ")' oder 'pdb.runcall (foo, 1, 2)' '. – abarnert

+0

Ich habe mich gerade heute dasselbe gefragt. Ich würde es die ganze Zeit nutzen, wenn es verfügbar wäre. Zeit, sich in die iPython-Quelle zu vertiefen, um zu sehen, wie sie implementiert werden könnte. –

+0

Mögliches Duplikat von [Ist es möglich, Befehle in IPython mit Debugging auszuführen?] (Https://stackoverflow.com/questions/9689378/is-it-possible-to-run-commands-in-ipython-with-debugging) –

Antwort

42

ipdb hatte Unterstützung für Runcall, Runeval und laufen seit 0.7, früher in diesem Jahr. Sie können es genauso verwenden wie pdb.runcall:

In [1]: def foo(a, b): 
    ...:  print a + b 
    ...: 

In [2]: import ipdb 

In [3]: ipdb.runcall(foo, 1, 2) 
> <ipython-input-1-2e565fd9c4a4>(2)foo() 
     1 def foo(a, b): 
----> 2  print a + b 
     3 

ipdb> 
+0

Das ist ziemlich genau das, was ich brauche. Danke für das Hinweis auf das Update 0.7, ich hatte eine ältere Version. Es ist wahrscheinlich einfach, eine ipython magic hinzuzufügen, die runcall verwendet. –

+8

Tatsächlich stellt sich heraus, dass Sie die externe ipdb nicht benötigen, Sie können einfach 'von IPython.core.debugger importieren Pdb; ipdb = Pdb() '. –

+1

Nicht die eleganteste Methode. Ich erwartete eine magische Funktion für solch ein gemeinsames Bedürfnis. Ich frage mich, ob es nicht ein allgemeines Bedürfnis für "SciPy" -Nutzer ist ... –