In Java/C # können Sie leicht durch den Code navigieren, um zu ermitteln, was möglicherweise schief läuft, und IDE macht diesen Prozess sehr benutzerfreundlich.
Können Sie Python-Code auf ähnliche Weise nachverfolgen?
Ja! Dafür gibt es einen Python-Debugger namens pdb
!
Sie können ein Python-Programm über pdb
starten, indem Sie pdb myscript.py
oder python -m pdb myscript.py
verwenden.
Sie können dann einige Befehle ausgeben, die auf der Seite pdb
dokumentiert sind.
Einige nützliche Punkte sind:
b
: Setzen Sie einen Haltepunktc
: Fahren Sie mit dem Debuggen fort, bis Sie einen Haltepunkt erreichens
: Schritt durch den Coden
: um zur nächsten Codezeile zu gelangenl
: Listet den Quellcode für die aktuelle Datei auf (Standard: 11 Zeilen einschließlich der gerade ausgeführten Zeile).u
: navigiere einen Stack-Frame nach obend
: navigiere einen Stack-Frame herunterp
: um den Wert eines Ausdrucks im aktuellen Kontext zu druckenWenn Sie keinen Befehlszeilen-Debugger verwenden möchten, verfügen einige IDEs wie Pydev über einen GUI-Debugger.
Der erste Schritt besteht darin, den Python-Interpreter in den Debugging-Modus zu bringen.
A. Von der Befehlszeile aus
Der direkteste Weg, der von der Kommandozeile aus läuft, des Python-Interpreters
$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)
B. Innerhalb des Interpreters
Bei der Entwicklung früherer Versionen von Modulen und beim iterativen Experimentieren.
$ python
Python 2.7 (r27:82508, Jul 3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)
C. Aus Ihrem Programm heraus
Bei einem großen Projekt und einem lang laufenden Modul kann das Debuggen aus dem Programm heraus gestartet werden. Verwenden Sie dazu import pdb und set_trace () Wie folgt:
#!/usr/bin/env python
# encoding: utf-8
#
import pdb
class MyObj(object):
count = 5
def __init__(self):
self.count= 9
def go(self):
for i in range(self.count):
pdb.set_trace()
print i
return
if __== '__main__':
MyObj(5).go()
Step-by-Step-Debugging für mehr interne
Führen Sie die nächste Anweisung aus… mit “n” (weiter)
Wiederholen des letzten Debuggingbefehls… mit GEBEN SIE ein
Alles beenden… mit “q” (quit)
Wert von Variablen drucken… mit „p“ (drucken)
a) p a
Ausschalten der (Pdb-) Eingabeaufforderung… mit “c” (weiter)
Sehen, wo Sie sind… mit “l” (Liste)
Einstieg in Unterprogramme… mit „s“ (einsteigen)
Fortsetzung… aber nur bis zum Ende des aktuellen Unterprogramms… mit “r” (Zurück)
Vergeben Sie einen neuen Wert
a) ! b = "B"
Legen Sie einen Haltepunkt fest
a) Bruchstücknummer
b) break Funktionsname
c) break Dateiname: Leinennummer
Temporärer Haltepunkt
a) tbreak Leinennummer
Bedingter Haltepunkt
a) Bruchstücknummer, Bedingung
Hinweis: ** Alle diese Befehle sollten von ** pdb ausgeführt werden.
Für vertiefte Kenntnisse siehe: -
https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/
In Python gibt es ein Modul namens 'pdb'. Ganz oben in Ihrem Python-Skript
import pdb
pdb.set_trace()
und Sie werden in den Debugging-Modus wechseln. Sie können mit 's' einen Schritt ausführen, 'n', um die nächste Zeile zu verfolgen, ähnlich wie Sie es mit 'gdb' Debugger tun würden.
Ab Python 3.7 können Sie die integrierte Funktion breakpoint()
verwenden, um den Debugger aufzurufen:
foo()
breakpoint() # drop into the debugger at this point
bar()
Standardmäßig importiert breakpoint()
pdb
und ruft pdb.set_trace()
auf. Sie können das Debugging-Verhalten jedoch über sys.breakpointhook()
und die Verwendung der Umgebungsvariablen PYTHONBREAKPOINT
steuern.
Weitere Informationen finden Sie unter PEP 553 .
Wenn Sie eine IDE mit integriertem Debugger benötigen, versuchen Sie PyScripter .
Es gibt heutzutage breakpoint()
Methoden, die import pdb; pdb.set_trace()
ersetzen.
Es hat auch mehrere neue Funktionen , wie etwa mögliche Umgebungsvariablen.
ipdb fügt pdb die IPython-Funktionalität hinzu und bietet die folgenden HUGE-Verbesserungen:
Die Verwendung ist analog zu pdb
. Installieren Sie es einfach mit:
python3 -m pip install --user ipdb
und fügen Sie dann der Zeile hinzu, von der aus Sie debuggen möchten:
__import__('ipdb').set_trace(context=21)
Sie möchten wahrscheinlich aus Ihrem Editor eine Verknüpfung dafür hinzufügen, z. für Vim snipmate Ich habe:
snippet ipd
__import__('ipdb').set_trace(context=21)
also kann ich einfach ipd<tab>
eingeben und es erweitert sich auf den Haltepunkt. Dann ist das Entfernen mit dd
einfach, da alles in einer einzigen Zeile enthalten ist.
context=21
erhöht die Anzahl der Kontextzeilen wie folgt beschrieben: Wie kann ich erreichen, dass ipdb beim Debuggen mehr Kontextzeilen anzeigt?
Alternativ können Sie Programme auch von Anfang an debuggen mit:
ipdb3 main.py
aber im Allgemeinen möchten Sie das nicht, weil:
Alternativ können Sie wie in raw pdb 3.2+ einige Haltepunkte über die Befehlszeile festlegen:
ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py
obwohl -c c
aus irgendeinem Grund defekt ist: https://github.com/gotcha/ipdb/issues/156
Die Tab-Vervollständigung funktioniert dann wie in IPython mit Tab
.
Ähnlich wie bei pdg ist ipdb im Vergleich zu GDB noch lange nicht perfekt und völlig rudimentär, aber es ist bereits eine große Verbesserung gegenüber pdb.
python -m module
debugging wurde gefragt: Wie debugge ich ein Python-Modul, das mit Python -m von der Befehlszeile aus ausgeführt wird? und seit Python 3.7 kann man mit:
python -m pdb -m my_module
Schwerwiegende fehlende Funktionen von pdb und ipdb im Vergleich zu GDB:
Getestet in Ubuntu 16.04, ipdb = 0,11, Python 3.5.2.
Visual Studio mit PTVS könnte eine Option für Sie sein: http://www.hanselman.com/blog/OneOfMicrosoftsBestKeptSecretsPythonToolsForVisualStudioPTVS.aspx
Das programmgesteuerte schrittweise Durchlaufen von Python-Code ist ebenfalls möglich (und das ganz einfach!). Weitere Informationen finden Sie in der Dokumentation zu sys.settrace () . Auch here ist ein Tutorial, um Ihnen den Einstieg zu erleichtern.
https://wiki.python.org/moin/PythonDebuggingTools
pudb ist ein guter Ersatz für pdb
Python Tutor ist ein Online-Einzelschritt-Debugger. Sie können Code auf der Seite bearbeiten eingeben und dann auf "Ausführung visualisieren" klicken, um die Ausführung zu starten.
PyCharm ist ein IDE für Python, das einen Debugger enthält. In diesem YouTube-Video finden Sie eine Einführung in die Verwendung des PyCharm-Debuggers zum Durchlaufen des Codes.
PyCharm Tutorial - Debuggen von Python-Code mit PyCharm
Hinweis: Dies ist nicht als Bestätigung oder Überprüfung gedacht. PyCharm ist ein kommerzielles Produkt, für das bezahlt werden muss, aber das Unternehmen bietet eine kostenlose Lizenz für Schüler und Lehrer sowie eine "leichte" Community-Version an, die kostenlos und Open Source ist.