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

183

In Java / C # können Sie leicht durch den Code gehen, um zu verfolgen, was möglicherweise schief geht, und IDEs machen diesen Prozess sehr benutzerfreundlich.

Können Sie Python-Code auf ähnliche Weise verfolgen?

Blankman
quelle

Antworten:

261

Ja! Es gibt einen Python-Debugger, der pdbnur dafür aufgerufen wird !

Sie können ein Python-Programm pdbmit pdb myscript.pyoder starten python -m pdb myscript.py.

Sie können dann einige Befehle ausgeben, die auf der pdbSeite dokumentiert sind .

Einige nützliche sind:

  • b: Haltepunkt setzen
  • c: Setzen Sie das Debuggen fort, bis Sie einen Haltepunkt erreicht haben
  • s: Schritt durch den Code
  • n: um zur nächsten Codezeile zu gelangen
  • l: Quellcode für die aktuelle Datei auflisten (Standard: 11 Zeilen einschließlich der ausgeführten Zeile)
  • u: Navigieren Sie in einem Stapelrahmen nach oben
  • d: Navigieren Sie in einem Stapelrahmen nach unten
  • 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 , Wing IDE oder PyCharm über einen GUI-Debugger. Wing und PyCharm sind kommerzielle Produkte, aber Wing hat eine kostenlose "Personal" -Version und PyCharm eine kostenlose Community-Edition.

mit
quelle
10
Wow, ich kann nicht glauben, dass es mir schwer fällt, eine grafische PDF für Linux / Ubuntu zu finden. Vermisse ich etwas Möglicherweise muss ich ein SublimeText-Plugin dafür erstellen.
ThorSummoner
4
PyCharm eignet sich hervorragend als grafischer Debugger und die Community Edition ist kostenlos!
Pieter
@ThorSummoner, pudbist toll dafür. Alsopydev
Alpha_989
pdbist kein Befehlszeilenprogramm. Um es zu benutzen, benutze python -m pdb your_script.py.
JDHAO
55

Mit dem Python Interactive Debugger 'pdb'

Der erste Schritt besteht darin, den Python-Interpreter in den Debugging-Modus zu versetzen.

A. Über die Befehlszeile

Der einfachste Weg, der von der Kommandozeile aus ausgeführt wird, des Python-Interpreters

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. Innerhalb des Dolmetschers

Während Sie frühe Versionen von Modulen entwickeln und iterativer 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

Für ein großes Projekt und ein lang laufendes Modul kann das Debuggen aus dem Programm heraus gestartet werden, indem import pdb und set_trace () wie folgt verwendet werden :

#!/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 __name__ == '__main__':
    MyObj(5).go()

Schritt-für-Schritt-Debugging für mehr interne Funktionen

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

  2. Wiederholen des letzten Debugging-Befehls… mit ENTER

  3. Alles beenden ... mit "q" (beenden)

  4. Drucken des Wertes von Variablen… mit „p“ (Drucken)

    a) pa

  5. Ausschalten der Eingabeaufforderung (Pdb)… mit „c“ (Weiter)

  6. Sehen, wo Sie sind ... mit "l" (Liste)

  7. Betreten von Unterprogrammen… mit „s“ (Schritt in)

  8. Fortsetzung… aber nur bis zum Ende der aktuellen Unterroutine… mit „r“ (return)

  9. Weisen Sie einen neuen Wert zu

    a) ! b = "B"

  10. Setzen Sie einen Haltepunkt

    a) Leinenzahl brechen

    b) Funktionsname unterbrechen

    c) Dateiname brechen: Leinennummer

  11. Temporärer Haltepunkt

    a) Leinenzahl brechen

  12. Bedingter Haltepunkt

    a) Leinenzahl brechen, Zustand

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

Ausführliche Informationen finden Sie unter: -

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

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

akD
quelle
41

In Python gibt es ein Modul namens 'pdb'. Oben in Ihrem Python-Skript

import pdb
pdb.set_trace()

und Sie gelangen in den Debugging-Modus. Sie können 's' verwenden, um Schritt zu machen, 'n', um der nächsten Zeile zu folgen, ähnlich wie Sie es mit dem 'gdb'-Debugger tun würden.

Senthil Kumaran
quelle
21

Ab Python 3.7 können Sie mit der breakpoint()integrierten Funktion den Debugger aufrufen:

foo()
breakpoint()  # drop into the debugger at this point
bar()

Standardmäßig breakpoint()wird importiert pdbund aufgerufen pdb.set_trace(). Sie können das Debugging-Verhalten jedoch über sys.breakpointhook()die Umgebungsvariable und deren Verwendung steuern PYTHONBREAKPOINT.

Weitere Informationen finden Sie in PEP 553 .

Eugene Yarmash
quelle
2
Als ich sah, war breakpointich aufgeregt. Aber dann habe ich gelernt, dass es im Wesentlichen nur eine Abkürzung für ist import pdb; pdb.set_trace()und das hat mich traurig gemacht. Python-Entwickler: Bitte konzentrieren Sie sich auf die Verbesserung von PDB mit grundlegenden GDB-Funktionen wie Kontextzeilen, beständigem Befehlsverlauf und automatischer Vervollständigung von Registerkarten :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
10

ipdb (IPython-Debugger)

ipdb erweitert pdb um IPython-Funktionalität und bietet die folgenden RIESIGEN Verbesserungen:

  • Tab-Vervollständigung
  • Weitere Kontextlinien anzeigen
  • Syntax-Highlight

Ähnlich wie pdg ist ipdb im Vergleich zu GDB noch lange nicht perfekt und völlig rudimentär, aber es ist bereits eine enorme Verbesserung gegenüber pdb.

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 das Debuggen schrittweise ausführen möchten:

__import__('ipdb').set_trace(context=21)

Sie möchten wahrscheinlich eine Verknüpfung dazu aus Ihrem Editor hinzufügen, z. B. für Vim snipmate ich habe:

snippet ipd
    __import__('ipdb').set_trace(context=21)

so kann ich nur tippen ipd<tab> und es erweitert sich bis zum Haltepunkt. Dann ist das Entfernen einfach, ddda alles in einer einzigen Zeile enthalten ist.

context=21 erhöht die Anzahl der Kontextzeilen wie folgt: Erhöht Wie kann ich dafür sorgen, dass ipdb beim Debuggen mehr Kontextzeilen anzeigt?

Alternativ können Sie Programme auch von Anfang an debuggen mit:

ipdb3 main.py

Aber das wollen Sie im Allgemeinen nicht, weil:

  • Sie müssten alle Funktions- und Klassendefinitionen durchgehen, während Python diese Zeilen liest
  • Ich weiß nicht, wie ich die Kontextgröße dort einstellen soll, ohne ipdb zu hacken. Patch, um dies zuzulassen: https://github.com/gotcha/ipdb/pull/155

Alternativ können Sie wie in Raw-PDF 3.2+ einige Haltepunkte über die Befehlszeile festlegen:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

obwohl -c caus irgendeinem Grund kaputt ist: https://github.com/gotcha/ipdb/issues/156

python -m moduleDas Debuggen wurde gefragt unter: Wie debugge ich ein Python-Modul, das mit Python -m ausgeführt wird, über die Befehlszeile? und da Python 3.7 möglich ist mit:

python -m pdb -m my_module

Schwerwiegende fehlende Funktionen von pdb und ipdb im Vergleich zu GDB:

IPdB-spezifische Belästigungen:

Getestet in Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
5

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

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

Johnnyheineken
quelle
2

Wenn Sie eine IDE mit integriertem Debugger möchten, versuchen Sie es mit PyScripter .

irgendwie
quelle
2

Python Tutor ist ein Online-Einzelschritt-Debugger für Anfänger. Sie können Code für die Bearbeitung eingeben eingeben und dann auf "Ausführung visualisieren" klicken, um die Ausführung zu starten.

Unter anderem unterstützt es:

Es werden jedoch auch viele Dinge nicht unterstützt , zum Beispiel:

  • Dateien lesen / schreiben - verwenden io.StringIOund io.BytesIOstattdessen: Demo
  • Code, der zu groß ist, zu lange läuft oder zu viele Variablen oder Objekte definiert
  • Kommandozeilenargumente
  • Viele Standardbibliotheksmodule wie argparse, csv, enum, html, os, struct, schwach ...
wjandrea
quelle
1

Das programmgesteuerte Durchlaufen und Nachverfolgen von Python-Code ist ebenfalls möglich (und es ist einfach!). Weitere Informationen finden Sie in der Dokumentation zu sys.settrace () . Auch hier ist ein Tutorial, um Ihnen den Einstieg zu erleichtern.

Autodidakt
quelle
1

PyCharm ist eine IDE für Python, die 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 Sie Python-Code mit PyCharm

Hinweis: Dies ist keine Bestätigung oder Überprüfung. PyCharm ist ein kommerzielles Produkt, für das man bezahlen muss, aber das Unternehmen bietet Schülern und Lehrern eine kostenlose Lizenz sowie eine "leichte" Community-Version, die kostenlos und Open Source ist.

Bildschirmfoto

Jim
quelle