Was sind Ihre besten Tipps zum Debuggen von Python?
Bitte listen Sie nicht nur einen bestimmten Debugger auf, ohne zu sagen, was er tatsächlich kann.
verbunden
- Was sind gute Möglichkeiten, um meinen Python-Code zum ersten Mal auszuführen? - Hier wird die Minimierung von Fehlern erläutert
Antworten:
PDB
Sie können das pdb-Modul verwenden, an einer
pdb.set_trace()
beliebigen Stelle einfügen und es fungiert als Haltepunkt.Um die Ausführung fortzusetzen, verwenden Sie
c
(odercont
odercontinue
).Es ist möglich, beliebige Python-Ausdrücke mit pdb auszuführen. Wenn Sie beispielsweise einen Fehler finden, können Sie den Code korrigieren und dann einen Typausdruck eingeben, um den gleichen Effekt im laufenden Code zu erzielen
ipdb ist eine Version von pdb für IPython . Es ermöglicht die Verwendung von pdb mit allen IPython-Funktionen einschließlich der Tab-Vervollständigung.
Es ist auch möglich, pdb so einzustellen, dass es automatisch mit einer nicht erfassten Ausnahme ausgeführt wird.
Pydb wurde als erweiterte Version von Pdb geschrieben. Leistungen?
quelle
myserver.com/pdb
im Debug-Modus eine Ansicht hinzu , die dies einfach tutimport pdb; pdb.set_trace()
. Wenn Sie Flask / Werkzeug mit einem interaktiven Debugger verwenden, können Sie auch eine Ansicht haben, die dies nur tutassert False
.http://pypi.python.org/pypi/pudb , ein konsolenbasierter Python-Debugger im Vollbildmodus.
Gut zum Debuggen von eigenständigen Skripten, einfach ausführen
quelle
pip install pudb
Wenn Sie pdb verwenden, können Sie Aliase für Verknüpfungen definieren. Ich benutze diese:
quelle
Protokollierung
Python verfügt bereits über ein hervorragendes integriertes Protokollierungsmodul . Möglicherweise möchten Sie hier die Protokollierungsvorlage verwenden .
Mit dem Protokollierungsmodul können Sie einen Wichtigkeitsgrad angeben. Während des Debuggens können Sie alles protokollieren, während Sie während des normalen Betriebs möglicherweise nur kritische Dinge protokollieren. Sie können Dinge ein- und ausschalten.
Die meisten Benutzer verwenden nur einfache Druckanweisungen zum Debuggen und entfernen dann die Druckanweisungen. Es ist besser, sie zu belassen, aber zu deaktivieren. Wenn Sie dann einen anderen Fehler haben, können Sie einfach alles wieder aktivieren und Ihre Protokolle überprüfen.
Dies kann der beste Weg sein, um Programme zu debuggen, die schnell erledigt werden müssen, z. B. Netzwerkprogramme, die reagieren müssen, bevor das andere Ende der Netzwerkverbindung abläuft und nicht mehr funktioniert. Möglicherweise haben Sie nicht viel Zeit, um einen Debugger in einem Schritt auszuführen. Aber Sie können einfach Ihren Code laufen lassen und alles protokollieren, dann die Protokolle durchforsten und herausfinden, was wirklich passiert.
BEARBEITEN: Die ursprüngliche URL für die Vorlagen lautete: http://aymanh.com/python-debugging-techniques
Diese Seite fehlt, daher habe ich sie durch einen Verweis auf den unter archive.org gespeicherten Schnappschuss ersetzt: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Falls es wieder verschwindet, hier sind die Vorlagen, die ich erwähnt habe. Dies ist Code aus dem Blog; Ich habe es nicht geschrieben.
Und hier ist seine Erklärung, wie man das Obige benutzt. Auch hier bekomme ich keine Anerkennung:
Standardmäßig druckt das Protokollierungsmodul kritische Meldungen, Fehlermeldungen und Warnmeldungen. Verwenden Sie Folgendes, um dies so zu ändern, dass alle Ebenen gedruckt werden:
Verwenden Sie Folgendes, um Protokollnachrichten an eine Datei mit dem Namen debug.log zu senden:
quelle
Es ist möglich zu drucken, welche Python-Zeilen ausgeführt werden (danke Geo!). Dies hat eine beliebige Anzahl von Anwendungen. Sie können es beispielsweise ändern, um zu überprüfen, wann bestimmte Funktionen aufgerufen werden, oder etwas wie ## hinzufügen, damit nur bestimmte Zeilen verfolgt werden.
code.interact führt Sie in eine interaktive Konsole
Wenn Sie einfach auf Ihren Konsolenverlauf zugreifen möchten, lesen Sie: " Kann ich einen Verlaufsmechanismus wie in der Shell haben? " (Muss danach suchen).
Die automatische Vervollständigung kann für den Interpreter aktiviert werden .
quelle
ipdb ist wie pdb, mit der Großartigkeit von ipython.
quelle
print
Aussagendebug_print
Funktion anstelle von Drucken, um das Deaktivieren zu vereinfachenpprint
Modul ist für komplexe Strukturen von unschätzbarem Wertquelle
der offensichtliche Weg, um ein Skript zu debuggen
wenn Sie nicht genau wissen, wo sich das Skript befindet
quelle
PyDev
PyDev hat einen ziemlich guten interaktiven Debugger. Es verfügt über Watch-Ausdrücke, Hover-to-Evaluate-, Thread- und Stack-Listen und (fast) alle üblichen Annehmlichkeiten, die Sie von einem modernen visuellen Debugger erwarten. Sie können sogar eine Verbindung zu einem laufenden Prozess herstellen und Remote-Debugging durchführen.
Wie andere visuelle Debugger finde ich es jedoch hauptsächlich für einfache Probleme oder für sehr komplizierte Probleme nützlich, nachdem ich alles andere ausprobiert habe. Ich mache immer noch den größten Teil des schweren Hebens mit Holzeinschlag.
quelle
Wenn Sie mit Visual Studio vertraut sind, suchen Sie nach Python Tools für Visual Studio .
quelle
Winpdb ist sehr schön und im Gegensatz zu seinem Namen völlig plattformübergreifend.
Es hat einen sehr schönen prompt-basierten und GUI-Debugger und unterstützt Remote-Debugging.
quelle
In Vim habe ich diese drei Bindungen:
rpdb2
ist ein Remote Python Debugger, der mit WinPDB, einem soliden grafischen Debugger, verwendet werden kann. Weil ich weiß, dass Sie fragen werden, kann es alles, was ich von einem grafischen Debugger erwarte :)Ich benutze
pdb
von,nose.tools
damit ich Unit-Tests sowie normalen Code debuggen kann.Schließlich wird bei der
F7
Zuordnung ein Traceback gedruckt (ähnlich der Art, die Sie erhalten, wenn eine Ausnahme an die Spitze des Stapels sprudelt). Ich fand es mehr als ein paar Mal wirklich nützlich.quelle
Definieren Sie nützliche repr () -Methoden für Ihre Klassen (damit Sie sehen können, was ein Objekt ist) und verwenden Sie das Format repr () oder "% r"% (...) oder "... {0! R} .." (...) in Ihren Debug-Nachrichten / Protokollen ist meiner Meinung nach ein Schlüssel zum effizienten Debuggen.
Außerdem verwenden die in anderen Antworten erwähnten Debugger die repr () -Methoden.
quelle
Abrufen eines Stack-Trace von einer laufenden Python-Anwendung
Es gibt einige Tricks hier . Diese beinhalten
quelle
Wenn Sie keine Zeit in Debuggern verbringen möchten (und die schlechte Benutzerfreundlichkeit der
pdb
Befehlszeilenschnittstelle nicht schätzen ), können Sie die Ausführungsablaufverfolgung sichern und später analysieren. Beispielsweise:Dadurch wird die gesamte Quellausführungszeile an
setup.py install
ausgegebenexecution.log
.Um das Anpassen der Trace-Ausgabe und das Schreiben eigener Tracer zu vereinfachen , habe ich einige Codeteile im xtrace- Modul (gemeinfrei) zusammengestellt.
quelle
Wenn möglich, debugge ich
M-x pdb
in Emacs für das Debuggen auf Quellenebene.quelle
Es gibt einen vollständigen Online-Kurs namens " Software Debugging " von Andreas Zeller über Udacity mit Tipps zum Debuggen:
Sehr empfehlenswert.
quelle
Wenn Sie eine schöne grafische Möglichkeit zum lesbaren Drucken Ihres Anrufstapels wünschen, lesen Sie dieses Dienstprogramm: https://github.com/joerick/pyinstrument
Über die Befehlszeile ausführen:
Als Modul ausführen:
Laufen Sie mit Django:
Fügen Sie einfach
pyinstrument.middleware.ProfilerMiddleware
zuMIDDLEWARE_CLASSES
, fügen Sie dann?profile
bis zum Ende der Anforderungs - URL der Profiler zu aktivieren.quelle