Dies ist eine Frage, über die ich mich schon seit einiger Zeit Gedanken gemacht habe, aber ich habe nie eine geeignete Lösung gefunden. Wenn ich ein Skript ausführe und auf einen IndexError stoße, druckt Python die Zeile, den Ort und die schnelle Beschreibung des Fehlers und beendet ihn. Ist es möglich, pdb automatisch zu starten, wenn ein Fehler auftritt? Ich bin nicht dagegen, eine zusätzliche Importanweisung oben in der Datei zu haben, noch ein paar zusätzliche Codezeilen.
216
Antworten:
Sie können traceback.print_exc verwenden , um den Ausnahme-Traceback zu drucken. Verwenden Sie dann sys.exc_info , um den Traceback zu extrahieren, und rufen Sie schließlich pdb.post_mortem mit diesem Traceback auf
Wenn Sie eine interaktive Befehlszeile mit code.interact mit den Einheimischen des Frames starten möchten, von dem die Ausnahme stammt, können Sie dies tun
quelle
code
über ,pdb
da diese auf dem ehemaligen auszudehnen scheint?code
?sys.exc_info
, um den Traceback zu extrahieren und schließlichpdb.post_mortem
mit diesem Traceback aufzurufen . Sie müssen kein Traceback-Objekt an übergebenpdb.post_mortem
. Aus Dokumenten : Wenn kein Traceback angegeben wird, wird die Ausnahme verwendet, die derzeit behandelt wird (eine Ausnahme muss behandelt werden, wenn die Standardeinstellung verwendet werden soll).Wenn Sie das
-c continue
Flag nicht angeben, müssen Sie zu Beginn der Ausführung 'c' (für Weiter) eingeben. Dann läuft es bis zur Fehlerstelle und gibt Ihnen dort die Kontrolle. Wie von eqzx erwähnt , ist dieses Flag eine neue Ergänzung in Python 3.2, sodass für frühere Python-Versionen die Eingabe von 'c' erforderlich ist (siehe https://docs.python.org/3/library/pdb.html ).quelle
gdb
. und wenn Sie 'r' eingebenpdb
, wird das Programm zwar ausgeführt, aber bei einem Fehler NICHT gestoppt (noch eine Rückverfolgung generiert). hatte mich verwirrt, bis ich das las. Prost!ipdb
; und natürlich können Argumente nach dem Skript hinzugefügt werden!Verwenden Sie das folgende Modul:
Nennen Sie es
debug
(oder was auch immer Sie möchten) und fügen Sie es irgendwo in Ihren Python-Pfad ein.Fügen Sie jetzt zu Beginn Ihres Skripts einfach eine hinzu
import debug
.quelle
try-catch
nur hässliche IMO.pudb
sie aber vorpdb
. Kehren Sie immer wieder zum Kopieren und Einfügen zurück, was sicherlich etwas über den Mangel an Ordnung in meinem Leben aussagt.Ipython hat einen Befehl zum Umschalten dieses Verhaltens: % pdb . Es macht genau das, was Sie beschrieben haben, vielleicht sogar ein bisschen mehr (es bietet Ihnen informativere Backtraces mit Syntaxhervorhebung und Code-Vervollständigung). Es ist definitiv einen Versuch wert!
quelle
%debug
der Debugger nach Auftreten eines Fehlers geöffnet werden kann. Ich ziehe das oft vor%pdb
. (Der Kompromiss besteht lediglich darin,q
jedes Mal zu tippen,%debug
wenn Sie keinen Fehler debuggen möchten, und jedes Mal, wenn Sie einen Fehler debuggen möchten.)c.InteractiveShell.pdb = True
in jeder Sitzung automatischipython_config.py
einschaltet%pdb
.Dies ist nicht der Debugger, aber wahrscheinlich genauso nützlich (?)
Ich weiß, ich habe gehört, wie Guido dies irgendwo in einer Rede erwähnt hat.
Ich habe gerade Python -? Geprüft und wenn Sie den Befehl -i verwenden, können Sie dort interagieren, wo Ihr Skript gestoppt wurde.
Also gegeben dieses Skript:
Sie können diese Ausgabe erhalten!
Um ehrlich zu sein, habe ich das nicht benutzt, aber ich sollte es sein, scheint sehr nützlich zu sein.
quelle
IPython macht dies in der Befehlszeile einfach:
kann umgeschrieben werden
Oder ähnlich, wenn Sie ein Modul aufrufen:
kann umgeschrieben werden
Beachten Sie
--
, dass IPython die Argumente des Skripts nicht als eigene lesen soll.Dies hat auch den Vorteil, dass anstelle von pdb der erweiterte IPython-Debugger (ipdb) aufgerufen wird.
quelle
Wenn Sie verwenden
ipython
, geben Sie nach dem Start Folgendes ein%pdb
quelle
Wenn Sie die IPython-Umgebung verwenden, können Sie einfach das% -Debug verwenden, und die Shell bringt Sie zur Inspektion usw. zurück zur betreffenden Zeile mit der ipdb-Umgebung. Eine weitere Option, wie oben angegeben, ist die Verwendung der iPython magic% pdb, die dies effektiv tut das Gleiche.
quelle
up
unddown
Befehlen durch die Frames navigieren können, um zur Zeile Ihres Codes zurückzukehren, der den Fehler generiert hat.Sie können diese Zeile in Ihren Code einfügen:
Weitere Informationen: Starten Sie den Python-Debugger in einer beliebigen Zeile
quelle
Um es laufen zu lassen, ohne zu Beginn c eingeben zu müssen, verwenden Sie:
Pdb hat seine eigenen Befehlszeilenargumente: -cc führt zu Beginn der Ausführung den Befehl c (ontinue) aus und das Programm wird bis zum Fehler ununterbrochen ausgeführt.
quelle
python -m pdb script.py in python2.7 drücken Sie weiter, um zu starten, und es wird der Fehler ausgeführt und dort zum Debuggen unterbrochen.
quelle
Wenn Sie ein Modul ausführen:
Und jetzt möchten Sie eingeben,
pdb
wenn eine Ausnahme auftritt: Gehen Sie folgendermaßen vor:(oder verlängern Sie Ihre
PYTHONPATH
). DasPYTHONPATH
wird benötigt, damit das Modul im Pfad gefunden wird, da Sie daspdb
Modul jetzt ausführen.quelle
Fügen Sie einen Haltepunkt in den Konstruktor der obersten Ausnahmeklasse in der Hierarchie ein. In den meisten Fällen sehen Sie, wo der Fehler ausgelöst wurde.
Das Setzen eines Haltepunkts bedeutet, was immer Sie möchten: Sie können eine IDE verwenden oder
pdb.set_trace
oder was auch immerquelle