Einfachere Möglichkeit, PDB-Haltepunkte in Python-Code einzufügen?

105

Nur eine Frage der Bequemlichkeit. Ich war ein bisschen verwöhnt mit Debuggern in IDEs wie Visual Studio und XCode. Ich finde es etwas import pdb; pdb.set_trace()umständlich, etwas eingeben zu müssen, um einen Haltepunkt festzulegen (ich möchte lieber keine PDF-Datei oben in die Datei importieren, da ich sie möglicherweise vergessen und belassen könnte).

Gibt es eine einfachere Möglichkeit, einen Haltepunkt in Python-Code festzulegen, der so einfach und unauffällig ist wie das, was Sie in einer IDE sehen?

Joe
quelle
Verwenden Sie PyCharm. Wie könnte es einfacher sein, als eine Haltepunktzeile einzugeben, außer mit einer Python-IDE?
Ciro Santilli 31 冠状 病 六四 事件 31
Verwenden Sie python -m pdb <your_script>.py dann einfach b <line_number>, um den Haltepunkt auf die ausgewählte Zeilennummer zu setzen (keine Funktionsklammern). Drücken Sie c, um mit Ihrem Haltepunkt fortzufahren. Sie können alle Ihre Haltepunkte mit dem bBefehl selbst anzeigen. Geben Sie helpfür andere PDB - Befehle zur Verfügung , während das Debuggen zu sehen.
Arcseldon
1
Seit Python 3.7 können Sie jetzt die integrierte breakpoint()Funktion verwenden. python.org/dev/peps/pep-0553
Daniel

Antworten:

117

Sie können Ihr Programm über pdbdie Befehlszeile ausführen , indem Sie es ausführen

python -m pdb your_script.py

Es wird in der ersten Zeile unterbrochen. Anschließend können Sie mit dem breakBefehl einen beliebigen Haltepunkt in Ihrem Code hinzufügen. Die Syntax lautet:

b (reak) [[Dateiname:] lineno | Funktion [, Bedingung]]

Es ist flexibel genug, um Ihnen die Möglichkeit zu geben, überall einen Haltepunkt hinzuzufügen.

mdeous
quelle
24
Um diesen Punkt zu verdeutlichen, würde ich, wenn ich pdb.set_trace()in den Debugger gehe und den lBefehl (Liste) verwende und sehe, dass ich einen Haltepunkt in Zeile 27 setzen möchte, Folgendes eingeben: b 27und der Debugger würde einen Haltepunkt in Zeile 27 setzen (ich fand Die Dokumentation war etwas schwierig zu verstehen, daher wollte ich diesen Punkt der Klarstellung hinzufügen.
benjaminmgross
9
Auch, wenn Sie ein Objekt haben x, und Sie wollen stoppen , wenn seine Methode fgenannt wird, kann man sagen break x.f, und dann c(ontinue). Dies funktioniert auch dann, wenn sich das Objekt in einer unzugänglichen Datei befindet oder dynamisch erstellt wurde, z. B. durch Aufheben der Auswahl.
osa
2
Beim Debuggen nach einem Stacktrace können Sie den vollständigen Pfad in ein Modul kopieren und die Zeilennummer wie folgt anhängenb /data/users/me/project/env/local/lib/python2.7/site-packages/django/core/urlresolvers.py:596
gültig
58

Sie können verwenden:

from pdb import set_trace as bp

code
code
bp()
code
code
Apogentus
quelle
nicht sicher warum das überflüssige Aliasing, aber ;-). Aus irgendeinem Grund war meine IDE / Editor (vscode) eine Stute dieses AM und unterstreicht immer wieder. Ihren Kommentar zu sehen hat mir wirklich geholfen. Ich wünsche ihnen einen wunderbaren Tag!
MrMesees
Ich danke dir sehr!
macht
Wie kann ich den Import set_tracenur erzwingen, wenn ich bp () verwende?
Alper
39

In vim habe ich dafür ein Makro eingerichtet (in meiner .vimrc-Datei):

map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

Ich kann also einfach \ b drücken (wenn ich mich nicht im Einfügemodus befinde) und es wird ein Haltepunkt nach der aktuellen Zeile hinzugefügt, oder \ B (beachten Sie das Großbuchstaben) und es setzt einen vor die aktuelle Zeile.

das scheint in Ordnung zu funktionieren. Die meisten anderen "einfachen" Programmierer-Editoren (Emacs, Sublimetext usw.) sollten ähnliche einfache Möglichkeiten haben, dies zu tun.

Edit: Ich habe tatsächlich:

au FileType python map <silent> <leader>b oimport pdb; pdb.set_trace()<esc>
au FileType python map <silent> <leader>B Oimport pdb; pdb.set_trace()<esc>

Dadurch wird es nur für Python-Quelldateien aktiviert. Sie können sehr leicht ähnliche Zeilen für Javascript oder andere von Ihnen verwendete Sprachen hinzufügen.

Update 2019 (Python 3.7+)

Python 3.7+ hat jetzt das eingebaute, breakpoint()das das vorherige import pdb; pdb.set_trace()in vim ersetzen kann . Es funktioniert immer noch genauso.

Daniel
quelle
2
Gute Lösung, und die hinzugefügte Zeile hat auch den richtigen Einzug, wenn Sie set autoindentin Ihrer .vimrc- Datei haben.
Jealie
Ja, ich kann nicht verstehen, warum die meisten Distributionen nicht set autoindentstandardmäßig mit (und einer Reihe anderer Optionen) ausgeliefert werden. Eines der ersten Dinge, die ich mit einem neuen System mache, ist ein besseres Vimrc ...
Daniel
1
Verwenden Sie einfach ein vim namens register! Speichern Sie die Zeile, die Sie 'd' puffern möchten (wie in d ebug), indem Sie drücken "dyyund wann immer Sie es brauchen, tun Sie einfach "dpoder "dP. Lerne vim Register ! Sie sind sehr nützlich und werden immer unterstützt!
Polvoazul
wie man hinzufügt: w danach?
Ji-Ruh
Wenn Sie das benannte Registerkonzept etwas weiter verfolgen, können Sie ein Makro aufzeichnen, die erforderlichen Operationen ausführen und das Makro dann stoppen. Fügen Sie dann den Makroinhalt in Ihre vimrc-Datei ein. Starten Sie beispielsweise das Makro mit qdund "dpfügen Sie es später ein . Weisen Sie Ihre Anweisungen schließlich einem Register zu, das beim Laden von vim immer ausgefüllt wird. Beispiel: let @d = 'oimport pdb; pdb.set_trace()k0:w' Verwenden @dSie jetzt einfach, wann immer Sie die Zeile in eine Datei einfügen möchten. Das obige speichert auch die Datei. Sie müssen jedoch Ihre eigenen aufzeichnen (anstatt oben zu kopieren / einfügen), da spezielle Zeichen erforderlich sind (für die Flucht usw.).
Arcseldon
27

Wenn Sie nicht jedes Mal, wenn das Programm ausgeführt wird (in Python 3.2+), manuell Haltepunkte setzen möchten, sagen Sie beispielsweise, Sie möchten direkt in Zeile 3 einen Haltepunkt erstellen und die Ausführung dort stoppen:

python -m pdb -c "b 3" -c c your_script.py

Die folgenden Informationen können hilfreich sein:

Wenn eine Datei .pdbrc im Ausgangsverzeichnis des Benutzers oder im aktuellen Verzeichnis vorhanden ist, wird sie eingelesen und ausgeführt, als wäre sie an der Debugger-Eingabeaufforderung eingegeben worden. Dies ist besonders nützlich für Aliase. Wenn beide Dateien vorhanden sind, wird die Datei im Ausgangsverzeichnis zuerst gelesen und die dort definierten Aliase können von der lokalen Datei überschrieben werden.

In Version 3.2 geändert: .pdbrc kann jetzt Befehle enthalten, die das Debuggen fortsetzen, z. B. continue oder next. Bisher hatten diese Befehle keine Auswirkung.

Neu in Version 3.2: pdb.py akzeptiert jetzt die Option -c, mit der Befehle wie in einer .pdbrc-Datei ausgeführt werden (siehe Debugger-Befehle).

AXO
quelle
23

Ich habe es noch nicht ausprobiert, aber sie haben gerade einen neuen integrierten Breakpoint () in Python 3.7 implementiert, was bedeutet, dass Sie jetzt einen Breakpoint mit einer Anweisung einfügen können:

breakpoint()
Rechnung
quelle
1
Ab Python 3.7 ist dies die Antwort.
Eric
10

So würden Sie pdb in der Befehlszeile verwenden, ohne etwas in Ihrem Quellcode zu implementieren (die Dokumentation und andere Online-Ressourcen erklären dies nicht gut einem Programmierer, der in der Vergangenheit nur visuelle Debugger verwendet hat):

Starten Sie pdb, indem Sie Folgendes in eine Shell-Eingabeaufforderung eingeben:

python -m pdb 'python_script'

Dieser Befehl initialisiert pdb und der pdb-Debugger wird in der ersten Zeile Ihres python_script unterbrochen und wartet auf eine Eingabe von Ihnen:

(Pdb)

Dies ist die Schnittstelle für die Kommunikation mit dem Debugger. Jetzt können Sie hier Ihre Befehle angeben. Im Gegensatz zur Verwendung von Schaltflächen oder Tastaturkürzeln in visuellen Debuggern verwenden Sie hier Befehle, um dieselben Ergebnisse abzuleiten.

Sie können mit dem Befehl "n" (weiter) zur nächsten Zeile in Ihrem Code wechseln:

(Pdb) n

Wenn Sie einen nächsten Vorgang ausführen, werden die Zeilennummer und der spezifische Code in der Quelle angezeigt:

> python_script(line number)method name
-> current line in the source code

Sie können einen Haltepunkt festlegen, indem Sie eine Zeilennummer in Ihrem Quellcode angeben.

(Pdb) b 50

Hier ist der Debugger so eingestellt, dass er in Zeile 50 unterbrochen wird. Wenn keine anderen Haltepunkte vorhanden sind, ist der Haltepunkt in Zeile 50 der erste und kann durch die Haltepunkt-ID referenziert werden, die in diesem Fall 1 ist. Wenn Sie weitere Haltepunkte hinzufügen, erhalten diese nacheinander Bezeichner (z. B. 2, 3 usw.).

Sobald ein Haltepunkt festgelegt ist, führen Sie Ihr Programm weiter aus, bis pdb den Haltepunkt wie folgt erreicht:

(Pdb) c

Sobald Sie einen Haltepunkt erreicht haben, können Sie mit dem Befehl n wie zuvor beschrieben zur nächsten Zeile wechseln. Wenn Sie die Werte von Variablen untersuchen möchten, führen Sie den Parameterbefehl wie folgt aus:

(Pdb) p variable_name

Wenn Sie keinen Haltepunkt mehr benötigen, können Sie ihn löschen, indem Sie die ID des Haltepunkts mit dem Befehl clear übergeben:

(Pdb) clear 1

Wenn Sie mit dem Debugger fertig sind, können Sie die Ausführung wie den Python-Befehlszeileninterpreter beenden.

(Pdb) exit()

Ich hoffe, dies wird jedem helfen, mit pdb zu beginnen. Hier ist eine Liste von Befehlen, die Sie mit dem Debugger verwenden können: pdb also Fragen und Antworten

picmate 涅
quelle
4

Sie können eine IDE verwenden, die das Debuggen von Python unterstützt, oder Sie können sich das hervorragende Winpdb-Tool ansehen. Dies funktioniert auf jeder Plattform und bietet grafische Debugging-Funktionen für Ihr Python-Skript.

http://winpdb.org/

Glenjamin
quelle
2

Sie können verwenden:

  • Flügelidee
  • Eclipse mit dem Pydev-Plugin
  • Pycharms

Alle oben genannten Funktionen unterstützen das Python-Debugging innerhalb einer IDE.

vvatsa
quelle
0

Wenn in Atom Python-Plugins installiert sind, können Sie einfach 'pdb ' eingeben und die Eingabetaste drücken. Das Snippet gibt import ein und verfolgt es für Sie zurück.

Ich habe mich jetzt daran gewöhnt, dass ich es manchmal einfach eingebe, selbst wenn ich es in vim bearbeite und darauf warte, dass das Dropdown-Menü angezeigt wird.

Simplex
quelle
0

Eine unterschätzte Methode besteht darin, den Haltepunkt in pdb direkt festzulegen:

pdb> b torch/__init__:10

setzt einen Haltepunkt auf site-packages\torch\__init__.py:10

Dann pdb> cwird an diesem Haltepunkt angehalten.

Folgendes gilt ebenfalls:

pdb> b d:\anaconda\lib\site-packages\torch\__init__.py:10
pdb> b torch\__init__.py:10
pdb> b d:\\anaconda\\lib\\site-packages\\torch\\__init__.py:10
pdb> b d:/anaconda/lib/site-packages/torch/__init__.py:10

Siehe Dokument für Details.

Januar Vorstand
quelle
0

Sie können Vim mit dem Python-Mode- Plugin oder Emacs mit dem Elpy- Plugin verwenden.

Mit diesen Plugins erhalten Sie Haltepunkte mit einfachen Tastenanschlägen ( \ bin Vim und C-c C-u bin Emacs) sowie vielen anderen Funktionen von schwergewichtigen IDEs (Code-Faltung, Refactoring, Flusen usw.) - alles in einem leichten Terminal-basierten Texteditor.

Chris Abraham
quelle
-1

Der einfachste Weg, den Debugger in Ihrem Skript auszuführen, ist einfach

pdb your_script.py

Das Ausführen von pdb auf einer Linux-Befehlszeile gibt

usage: pdb.py scriptfile [arg] ...
Timbo
quelle
Wie installiere ich pdb? Oder von wo?
Kenorb