Für meine Debugging-Anforderungen ist pdb
ziemlich gut. Es wäre jedoch viel cooler (und hilfreich), wenn ich in ipython
gehen könnte. Ist das möglich?
Es gibt ein ipdb
-Projekt, das iPython in die Standard-PDB einbettet. Sie können also Folgendes tun:
import ipdb; ipdb.set_trace()
Es kann über den üblichen pip install ipdb
installiert werden.
ipdb
ist ziemlich kurz. Anstelle von easy_installing können Sie auch eine Datei ipdb.py
irgendwo in Ihrem Python-Pfad erstellen und Folgendes in die Datei einfügen:
import sys
from IPython.Debugger import Pdb
from IPython.Shell import IPShell
from IPython import ipapi
Shell = IPShell(argv=[''])
def set_trace():
ip = ipapi.get()
def_colors = ip.options.colors
Pdb(def_colors).set_trace(sys._getframe().f_back)
In IPython 0.11 können Sie IPython auf diese Weise direkt in Ihren Code einbetten
Ihr Programm könnte so aussehen
In [5]: cat > tmpf.py
a = 1
from IPython import embed
embed() # drop into an IPython session.
# Any variables you define or modify here
# will not affect program execution
c = 2
^D
Dies geschieht, wenn Sie es ausführen (ich habe es willkürlich ausgewählt, es in einer vorhandenen ipython-Sitzung auszuführen. Wenn Sie solche ipython-Sitzungen in meiner Erfahrung verschachteln, kann dies zum Absturz führen).
In [6]:
In [6]: run tmpf.py
Python 2.7.2 (default, Aug 25 2011, 00:06:33)
Type "copyright", "credits" or "license" for more information.
IPython 0.11 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: who
a embed
In [2]: a
Out[2]: 1
In [3]:
Do you really want to exit ([y]/n)? y
In [7]: who
a c embed
Wenn Sie eine modernere Version von IPython verwenden (> 0.10.2), können Sie so etwas verwenden
from IPython.core.debugger import Pdb
Pdb().set_trace()
Es ist jedoch wahrscheinlich besser, nur ipdb zu verwenden
Das Äquivalent von
import pdb; pdb.set_trace()
mit IPython ist so etwas wie:
from IPython.ipapi import make_session; make_session()
from IPython.Debugger import Pdb; Pdb().set_trace()
Es ist ein bisschen ausführlich, aber es ist gut zu wissen, ob Sie ipdb nicht installiert haben. Der make_session
-Aufruf ist einmalig, um das Farbschema usw. einzurichten, und set_trace
-Aufrufe können an beliebigen Stellen platziert werden, an denen Sie eine Unterbrechung benötigen.
Normalerweise schalte ich bei Verwendung von ipython das automatische Debugging mit dem Befehl "pdb" ein.
Ich führe dann mein Skript mit dem Befehl "myscript.py ausführen" in dem Verzeichnis aus, in dem sich mein Skript befindet.
Wenn ich eine Ausnahme bekomme, stoppt ipython das Programm im Debugger. Checke den Hilfebefehl für die magischen ipython-Befehle (% magic)
Ich füge diesen Einzeiler einfach in meine Skripte ein, wo ich einen Haltepunkt setzen möchte:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
Neuere Versionen verwenden möglicherweise:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
Es sieht so aus, als ob Module in letzter Zeit ein bisschen gemischt wurden. Unter IPython 0.13.1 funktioniert Folgendes für mich
from IPython.core.debugger import Tracer; breakpoint = Tracer()
breakpoint() # <= wherever you want to set the breakpoint
Leider ist alles hübsch wertlos in qtconsole .
Neuere Versionen von IPython bieten einen einfachen Mechanismus zum Einbetten und Verschachteln von IPython-Sitzungen in beliebige Python-Programme. Sie können dem folgenden Rezept folgen, um IPython-Sitzungen einzubetten:
try:
get_ipython
except NameError:
banner=exit_msg=''
else:
banner = '*** Nested interpreter ***'
exit_msg = '*** Back in main IPython ***'
# First import the embed function
from IPython.frontend.terminal.embed import InteractiveShellEmbed
# Now create the IPython Shell instance. Put ipshell() anywhere in your code
# where you want it to open.
ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
Verwenden Sie dann ipshell()
, wenn Sie in eine IPython-Shell wechseln möchten. Auf diese Weise können Sie IPython-Interpreter in Ihren Code einbetten (und sogar verschachteln).
Aus den IPython-Dokumenten :
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
startet programmgesteuert eine IPython-Shell. Offensichtlich handelt es sich bei den Werten in der Variable namespace
nur um Dummy-Werte. In der Praxis ist es sinnvoller, locals()
zu verwenden.
Beachten Sie, dass Sie dies hart in kodieren müssen; Es wird nicht so funktionieren wie pdb
. Wenn Sie das wollen, ist DoxaLogos wahrscheinlich eher das, wonach Sie suchen.
Der schnelle und einfache Weg:
from IPython.Debugger import Tracer
debug = Tracer()
Dann schreib einfach
debug()
wo Sie mit dem Debuggen Ihres Programms beginnen möchten.
Ich musste dies ein paar Mal googeln, wenn in den letzten Tagen eine Antwort hinzugefügt wurde. Manchmal ist es schön, ein Skript normal ausführen zu können und bei Fehlern nur in ipython/ipdb zu speichern, ohne ipdb.set_trace()
-Haltepunkte in den Code einfügen zu müssen
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(erster pip install ipython
und pip install ipdb
natürlich)
Das ist ziemlich einfach:
ipython some_script.py --pdb
Es muss iPython installiert werden, normalerweise funktioniert dies: pip install ipython
Ich verwende ipython3 anstelle von ipython, daher weiß ich, dass es sich um eine aktuelle Version von Python handelt.
Dies ist einfach zu merken, da Sie statt Python nur iPython verwenden und am Ende --pdb hinzufügen.