web-dev-qa-db-ger.com

Wie gehe ich durch den Python-Code, um Probleme zu beheben?

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?

130
Blankman

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 Haltepunkt
  • c: Fahren Sie mit dem Debuggen fort, bis Sie einen Haltepunkt erreichen
  • s: Schritt durch den Code
  • n: um zur nächsten Codezeile zu gelangen
  • l: 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 oben
  • d: navigiere einen Stack-Frame herunter
  • p: um den Wert eines Ausdrucks im aktuellen Kontext zu drucken

Wenn Sie keinen Befehlszeilen-Debugger verwenden möchten, verfügen einige IDEs wie Pydev über einen GUI-Debugger.

192
user193476

Mit Python Interactive Debugger "pdb"

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

  1. Führen Sie die nächste Anweisung aus… mit “n” (weiter)

  2. Wiederholen des letzten Debuggingbefehls… mit GEBEN SIE ein

  3. Alles beenden… mit “q” (quit)

  4. Wert von Variablen drucken… mit „p“ (drucken)

    a) p a

  5. Ausschalten der (Pdb-) Eingabeaufforderung… mit “c” (weiter)

  6. Sehen, wo Sie sind… mit “l” (Liste)

  7. Einstieg in Unterprogramme… mit „s“ (einsteigen)

  8. Fortsetzung… aber nur bis zum Ende des aktuellen Unterprogramms… mit “r” (Zurück)

  9. Vergeben Sie einen neuen Wert

    a) ! b = "B"

  10. Legen Sie einen Haltepunkt fest

    a) Bruchstücknummer

    b) break Funktionsname

    c) break Dateiname: Leinennummer

  11. Temporärer Haltepunkt

    a) tbreak Leinennummer

  12. Bedingter Haltepunkt

    a) Bruchstücknummer, Bedingung

Hinweis: ** Alle diese Befehle sollten von ** pdb ausgeführt werden.

Für vertiefte Kenntnisse siehe: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

38
akD

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.

32
Senthil Kumaran

Wenn Sie aus einem Java/C # -Hintergrund stammen, ist Ihre beste Wette die Verwendung von Eclipse mit Pydev . Damit haben Sie ein voll funktionsfähiges IDE mit eingebautem Debugger. Ich verwende es auch mit Django.

3
Liorsion

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 .

3
Eugene Yarmash

Wenn Sie eine IDE mit integriertem Debugger benötigen, versuchen Sie PyScripter .

2
kindall

Es gibt heutzutage breakpoint() Methoden, die import pdb; pdb.set_trace() ersetzen.

Es hat auch mehrere neue Funktionen , wie etwa mögliche Umgebungsvariablen.

2
johnnyheineken

ipdb

ipdb fügt pdb die IPython-Funktionalität hinzu und bietet die folgenden HUGE-Verbesserungen:

  • tab Vervollständigung
  • zeige mehr Kontextzeilen
  • syntax-Highlight

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:

  • sie müssten alle Funktions- und Klassendefinitionen durchgehen, da Python diese Zeilen liest
  • Ich kann nicht die Kontextgröße dort einstellen, ohne ipdb zu hacken. Patch, um dies zu ermöglichen: https://github.com/gotcha/ipdb/pull/155

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.

1
Aaron Hoffman

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.

1
Autodidact

https://wiki.python.org/moin/PythonDebuggingTools

pudb ist ein guter Ersatz für pdb

1
Neil

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.

0
wjandrea

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. 

 Screenshot

0
jim