Diese Frage habe ich mir schon länger gestellt, aber ich habe noch nie eine passende Lösung gefunden. Wenn ich ein Skript ausführe und mir einen IndexError übergebe, gibt python die Zeile, den Ort und die schnelle Beschreibung des Fehlers aus und wird beendet. Ist es möglich, pdb automatisch zu starten, wenn ein Fehler auftritt? Ich bin nicht dagegen, am Anfang der Datei eine zusätzliche Importanweisung zu haben, noch ein paar zusätzliche Zeilen Code. DieseAutomatisches Starten des Python-Debuggers bei Fehler
Antwort
Sie können traceback.print_exc verwenden, um den Traceback der Ausnahmen zu drucken. Dann sys.exc_info verwenden, um die Rückverfolgung zu extrahieren und schließlich rufen pdb.post_mortem mit dem Zurückverfolgungs
import pdb, traceback, sys
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
type, value, tb = sys.exc_info()
traceback.print_exc()
pdb.post_mortem(tb)
Wenn Sie eine interaktive Kommandozeile mit code.interact mit den Einheimischen des Rahmens beginnen soll, wo die Ausnahme stammen die Sie tun können
import traceback, sys, code
def bombs():
a = []
print a[0]
if __name__ == '__main__':
try:
bombs()
except:
type, value, tb = sys.exc_info()
traceback.print_exc()
last_frame = lambda tb=tb: last_frame(tb.tb_next) if tb.tb_next else tb
frame = last_frame().tb_frame
ns = dict(frame.f_globals)
ns.update(frame.f_locals)
code.interact(local=ns)
Die erste Lösung wird im [Python-Kochbuch] (http://code.activestate.com/recipes/65287-automatisch-start-the-debugger-on-an-exception/) weiter diskutiert. – dirkjot
Warum sollte jemand Code bevorzugen? 'über' pdb', da letzteres auf ersteren auszudehnen scheint? –
Ich habe die gleiche Frage? Warum würdest du "Code" bevorzugen? – ARH
ist nicht der Debugger, aber wahrscheinlich genauso nützlich (?)
Ich weiß, ich hörte Guido dies irgendwo in einer Rede erwähnen.
Ich habe gerade Python -? Überprüft, und wenn Sie den Befehl -i verwenden, können Sie interagieren, wo Ihr Skript gestoppt wurde.
So dieses Skript gegeben:
testlist = [1,2,3,4,5, 0]
prev_i = None
for i in testlist:
if not prev_i:
prev_i = i
else:
result = prev_i/i
Sie diese Ausgabe erhalten können!
PS D:\> python -i debugtest.py
Traceback (most recent call last):
File "debugtest.py", line 10, in <module>
result = prev_i/i
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> prev_i
1
>>> i
0
>>>
Um ehrlich zu sein habe ich das nicht verwendet, aber ich sollte, scheint sehr nützlich.
Verwenden sie das folgende Modul:
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
# pdb.pm() # deprecated
pdb.post_mortem(tb) # more "modern"
sys.excepthook = info
Name it debug
(oder was auch immer Sie mögen) und legen Sie es irgendwo in Ihrem Python-Pfad.
Fügen Sie jetzt am Anfang Ihres Skripts einfach import debug
hinzu.
Dies sollte die akzeptierte Antwort sein - es erfordert keine Änderung des bestehenden Codes oder alles in einem "try-catch", was nur hässlich IMO ist. – cyphar
python -m pdb -c continue myscript.py
Wenn Sie die -c continue
Flagge nicht bieten dann werden Sie brauchen ‚c‘ (für weiter) einzugeben, wenn die Ausführung beginnt. Dann wird es bis zum Fehlerpunkt laufen und dir Kontrolle geben. Als mentioned by eqzx ist dieses Flag eine neue Ergänzung in Python 3.2, daher ist die Eingabe von 'c' für frühere Python-Versionen erforderlich (siehe https://docs.python.org/3/library/pdb.html).
Wow, danke! Wenn jetzt dieser erste Aufruf von PDB auch vermieden werden könnte, wären die Dinge perfekt. Irgendwelche Ideen? – flonk
Danke für die Erwähnung der "_enter 'c'_" - ich normalerweise verwendet, um' r 'einzugeben (für "run"), gewöhnt man es von 'gdb'; und wenn Sie "r" in "pdb" eingeben, wird zwar ein Programm ausgeführt, es wird jedoch bei einem Fehler NICHT gestoppt (oder es wird kein backtrace generiert). habe mich verwirrt, bis ich das gelesen habe. Prost! – sdaau
Ich habe deine Methode ausprobiert. Aber es scheint keine wirkliche Kontrolle wie die Überprüfung von Variablen zum Zeitpunkt des Fehlers zu bieten. Die einzige Option, die es zu bieten scheint, besteht darin, die Ausführung neu zu starten. –
Sie können diese Zeile im Code setzen:
import pdb ; pdb.set_trace()
Weitere Informationen: Start the python debugger at any line
Dies stoppt den Code und startet einen Debugger in der Zeile, in die Sie diesen Befehl setzen, nicht in der Zeile, in der eine Ausnahme aufgetreten ist. – dangonfast
IPython hat einen Befehl dieses Verhalten für Makeln: % pdb. Es tut genau das, was Sie beschrieben haben, vielleicht sogar ein bisschen mehr (Sie erhalten mehr informative Backtraces mit Syntax-Highlighting und Code-Vervollständigung). Es ist definitiv einen Versuch wert!
Und das ist die einzig vernünftige Antwort darauf. – Michael
Dokumentiert unter http://ipython.readthedocs.io/en/stable/interactive/magics.html#magic-pdb – matthiash
Beachten Sie, dass - wie auch in der verknüpften Dokumentation @matthiash vermerkt - '% debug 'das Öffnen erlaubt der Debugger _nach_ einem Fehler auftritt. Ich bevorzuge das oft über '% pdb'. (Der Kompromiss besteht darin, jedes Mal, wenn Sie nicht versuchen, einen Fehler zu debuggen oder '% debug ', jedes Mal, wenn Sie einen Fehler debuggen wollen,' q' einzugeben.) –
Setzen Sie einen Haltepunkt innerhalb des Konstruktors der obersten Ausnahmeklasse in der Hierarchie, und die meisten Male sehen Sie, wo der Fehler ausgelöst wurde.
ein Unterbrechungsmittel Putting was auch immer Sie es bedeuten soll: Sie eine IDE verwenden können, oder pdb.set_trace
, oder was auch immer
Um es laufen, ohne c am Anfang Verwendung eingeben zu müssen:
python -m pdb -c c <script name>
Pdb hat seine eigenen Befehlszeilenargumente: -cc führt beim Start der Ausführung den Befehl c (ontinue) aus, und das Programm läuft bis zum Fehler ununterbrochen.
IPython macht diese einfache auf der Kommandozeile:
python myscript.py arg1 arg2
kann
ipython --pdb myscript.py -- arg1 arg2
Oder ähnlich
neu geschrieben werden, wenn ein Modul anrufen:python -m mymodule arg1 arg2
kann neu geschrieben werden zu
ipython --pdb -m mymodule -- arg1 arg2
Beachten Sie die --
, um zu verhindern, dass IPython die Argumente des Skripts als seine eigenen liest.
Dies hat auch den Vorteil, den erweiterten IPython-Debugger (ipdb) anstelle von pdb aufzurufen.
Wenn Sie ein Modul ausgeführt werden:
python -m mymodule
Und jetzt wollen Sie pdb
eingeben, wenn eine Ausnahme auftritt, dies tun:
PYTHONPATH="." python -m pdb -c c mymodule/__main__.py
(oder verlängern Ihre PYTHONPATH
). Die PYTHONPATH
wird benötigt, damit das Modul im Pfad gefunden wird, da Sie jetzt das Modul pdb
ausführen.
Wenn Sie die IPython-Umgebung verwenden, können Sie einfach das% debug verwenden und die Shell bringt Sie zurück zur problematischen Zeile mit der ipdb-Umgebung für Inspektionen usw. Eine weitere Option ist die Verwendung des iPython magic% pdb, das macht das selbe.
python -m pdb script.py in python2.7 drücken Sie weiter, um zu starten und es wird auf den Fehler ausgeführt werden und brechen Sie dort zum debug.
- 1. Automatisches Starten von AWS/Azure VM bei ankommendem Datenverkehr
- 2. Automatisches Starten eines Computers erzwingen?
- 3. Skript bei Fehler neu starten
- 4. Fehler bei der Segmentierung der Rails beim Starten des Servers?
- 5. Fehler beim Starten des Emulators
- 6. Automatisches Starten eines JBoss-Dienstes (MBean)
- 7. Automatisches Beenden von Bash-Shell-Skript bei Fehler
- 8. Fehler beim Starten des Dienstes jboss.persistenceunit rg.jboss.msc.service.StartException
- 9. Automatisches Öffnen des Wähltastenfelds bei ankommendem/ausgehendem Anruf
- 10. Flask + mod_wsgi automatisches Nachladen bei Änderung des Quellcodes
- 11. Inno Setup automatisches Löschen des schreibgeschützten Ordners bei der Deinstallation
- 12. Haskell Dmenu automatisches Starten auf Tastendruck
- 13. Fehler beim Starten des Remote-Programms: Starten oder Aussetzen läuft
- 14. Selen Fehler beim Starten des Browsers
- 15. Fehler beim Starten des Rails-Servers: "Unerwartetes .."
- 16. Fehler beim Starten des neuen Scrapy-Projekts
- 17. Apache Lens: Fehler beim Starten des Servers
- 18. Android: Fehler beim Starten des Emulators
- 19. Fehler beim Starten des modernen Compilers
- 20. Fehler beim Starten des Rails-Servers
- 21. Fehler beim Starten des Vorarbeiters (Dotenv :: FormatError)
- 22. Fehler beim Starten des Git-Prozesses
- 23. Fehler beim Starten des virtuellen Android-Geräts
- 24. Heroku-Dyn. Automatisch starten bei Fehler R14 (Speicherkontingent überschritten) Fehler
- 25. Automatisches Schließen des Scratch-Puffers
- 26. Automatisches vertikales Scrollen des Textes
- 27. ClientDataSet: Automatisches Anwenden des abgeglichenen Deltas?
- 28. Interstitielles automatisches Nachladen nach Fehler?
- 29. Fehler beim Starten des Dienstes 'Microsoft Service Fabric-Hostdienst (FabricHostSvc)'
- 30. Fehler beim Starten des Dienstes. Der OracleMTSRecoveryService wurde nicht gefunden
Haben Sie überlegt, die Antwort zu ändern, die akzeptiert wird? – Joost