Heim  >  Artikel  >  Backend-Entwicklung  >  Wie debugge ich Python?

Wie debugge ich Python?

青灯夜游
青灯夜游Original
2019-05-22 13:55:3816332Durchsuche

Die Wahrscheinlichkeit, dass das Programm einmal geschrieben und normal ausgeführt werden kann, ist sehr gering, im Grunde nicht mehr als 1 %. Es gibt immer verschiedene Fehler, die behoben werden müssen. Manche Fehler sind sehr einfach, wenn man sich die Fehlermeldung ansieht. Wir müssen wissen, welche Variablen korrekte Werte haben und welche Variablen falsche Werte haben ein vollständiger Satz von Mitteln zum Debuggen des Programms, um den Fehler zu beheben. Der folgende Artikel stellt Ihnen die Python-Debugging-Methode vor. Ich hoffe, er wird Ihnen hilfreich sein.

Wie debugge ich Python?

Methode 1: Drucken

Verwenden Sie Drucken, um die Variablen auszudrucken, bei denen möglicherweise Probleme auftreten. Diese Methode ist die einfachste Brutalität ist wirksam.

# err.py
def foo(s):
  n = int(s)
  print '>>> n = %d' % n
  return 10 / n

def main():
  foo('0')

main()

Suchen Sie nach der Ausführung den gedruckten Variablenwert in der Ausgabe:

$ python err.py
>>> n = 0
Traceback (most recent call last):
 ...
ZeropisionError: integer pision or modulo by zero

Der größte Nachteil der Verwendung von print besteht darin, dass Sie ihn in Zukunft löschen müssen wird überall im Programm gedruckt, und die laufenden Ergebnisse werden ebenfalls angezeigt. Es wird viel Spam enthalten.

Methode 2: bestätigen

Überall dort, wo Druck zur Unterstützung der Anzeige verwendet wird, kann stattdessen eine Behauptung verwendet werden:

# err.py
def foo(s):
  n = int(s)
  assert n != 0, 'n is zero!'
  return 10 / n

def main():
  foo('0')

assert bedeutet, dass die Ausdruck n != 0 sollte True sein, sonst geht der folgende Code schief.

Wenn die Behauptung fehlschlägt, löst die Assertion-Anweisung selbst AssertionError aus:

$ python err.py
Traceback (most recent call last):
 ...
AssertionError: n is zero!

Wenn das Programm voller Behauptungen ist, ist es nicht besser als print. Sie können jedoch den Parameter -O verwenden, um Assert beim Starten des Python-Interpreters zu deaktivieren:

$ python -O err.py
Traceback (most recent call last):
 ...
ZeropisionError: integer pision or modulo by zero

Nach dem Deaktivieren können Sie alle Assert-Anweisungen als Durchgänge anzeigen.

Methode 3: Protokollierung

Sie können Drucken auch durch Protokollierung ersetzen. Im Vergleich zu Assert löst die Protokollierung keinen Fehler aus und kann in eine Datei ausgegeben werden :

# err.py
import logging

s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n

logging.info() kann einen Text ausgeben. Führen Sie es aus und stellen Sie fest, dass außer ZeropisionError keine Informationen vorhanden sind. Was ist los?

Keine Sorge, fügen Sie nach der Importprotokollierung eine Konfigurationszeile hinzu und versuchen Sie es erneut:

import logging
logging.basicConfig(level=logging.INFO)

Siehe die Ausgabe:

$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
 File "err.py", line 8, in <module>
  print 10 / n
ZeropisionError: integer pision or modulo by zero

Das ist der Vorteil der Protokollierung , ermöglicht es Ihnen, die Ebene der Protokollierungsinformationen anzugeben, einschließlich Debug, Info, Warnung, Fehler usw. Wenn wir level=INFO angeben, funktioniert logging.debug nicht. Ebenso funktionieren Debug und Info nach der Angabe von level=WARNING nicht mehr. Auf diese Weise können Sie verschiedene Informationsebenen sicher ausgeben, ohne sie zu löschen, und schließlich steuern, welche Informationsebenen ausgegeben werden.

Ein weiterer Vorteil der Protokollierung besteht darin, dass durch einfache Konfiguration eine Anweisung gleichzeitig an verschiedene Orte ausgegeben werden kann, beispielsweise in die Konsole und in Dateien.

Methode 4: Debugger-PDB

Starten Sie die Python-Debugger-PDB, lassen Sie das Programm im Einzelschrittmodus laufen und Sie können den Ausführungsstatus jederzeit überprüfen. Wir bereiten zuerst das Programm vor:

# err.py
s = &#39;0&#39;
n = int(s)
print 10 / n

und starten dann:

$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<module>()
-> s = &#39;0&#39;

Nach dem Start mit dem Parameter -m pdb sucht pdb den Code, der als nächstes ausgeführt werden soll -> Geben Sie den Befehl l ein, um den Code anzuzeigen:

(Pdb) l
 1   # err.py
 2 -> s = &#39;0&#39;
 3   n = int(s)
 4   print 10 / n
[EOF]

Geben Sie den Befehl n ein, um den Code schrittweise durchzugehen:

(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<module>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n

Sie können jederzeit den Befehl p Variablenname eingeben, um die Variable anzuzeigen:

(Pdb) p s
&#39;0&#39;
(Pdb) p n
0

Geben Sie den Befehl q ein, um das Debuggen zu beenden und das Programm zu beenden:

(Pdb) n
ZeropisionError: &#39;integer pision or modulo by zero&#39;
> /Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
(Pdb) q

Diese Methode des Debuggens auf der Befehlszeile über pdb ist theoretisch allmächtig, aber sie ist wirklich problematisch Tausend Zeilen Code, Sie müssen ihn bis zur ersten ausführen. Wie viele Befehle sind erforderlich, um 999 Zeilen einzugeben?

Zusammenfassung

Das Schwierigste beim Schreiben eines Programms ist das Debuggen. Das Programm wird oft in einem unerwarteten Prozess ausgeführt und die Anweisungen, deren Ausführung Sie erwarten, werden nicht ausgeführt Zu diesem Zeitpunkt ist überhaupt ein Debugging erforderlich.

Verwandte Lernempfehlungen: Python-Tutorial

Das obige ist der detaillierte Inhalt vonWie debugge ich Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn