So führen Sie mehrzeilige Anweisungen in Pythons eigenem Debugger (PDB) aus

Lesezeit: 4 Minuten

Benutzer-Avatar
Mike

Also führe ich ein Python-Skript aus, in dem ich den Debugger von Python, PDB, aufrufe, indem ich schreibe:

import ipdb; ipdb.set_trace()

(iPython-Version von PDB, obwohl ich nicht glaube, dass es einen Unterschied macht; ich verwende es nur für die farbige Ausgabe).

Wenn ich jetzt zum Debugger komme, möchte ich eine mehrzeilige Anweisung wie eine if-Klausel oder eine for-Schleife ausführen, aber sobald ich tippe

if condition:

und die Return-Taste drücken, bekomme ich die Fehlermeldung *** SyntaxError: invalid syntax (<stdin>, line 1)

Wie kann man mehrzeilige Anweisungen innerhalb von PDB ausführen? Wenn dies nicht möglich ist, gibt es eine Möglichkeit, dies zu umgehen, um dennoch eine if-Klausel oder eine for-Schleife auszuführen?

Sie könnten dies tun, während Sie sich in pdb befinden, um eine temporäre interaktive Python-Sitzung mit allen verfügbaren lokalen Variablen zu starten:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Wenn Sie fertig sind, verwenden Sie Strg-D, um zur regulären pdb-Eingabeaufforderung zurückzukehren.

Drücken Sie einfach nicht Strg-C, das wird die gesamte PDB-Sitzung beenden.

  • Es scheint, dass dasselbe mit der pdb erreicht werden kann interact Befehl (wie ich aus dieser Bugtracker-Nachricht gelernt habe).

    – Gerrit

    11. Juni 2014 um 15:15 Uhr

  • Warum ist der ! benötigt in der import Aussage?

    – Indradhanush Gupta

    14. November 2014 um 9:06 Uhr

  • Es wird wahrscheinlich nicht benötigt, aber ich habe die Angewohnheit, allen Python-Anweisungen in pdb voranzustellen !, um Unfälle zu vermeiden. Z.B c = 42 in pdb würde fortsetzen Ausführung statt Zuweisung an Variable c.

    – Marius Gedminas

    14. November 2014 um 14:10 Uhr

  • @MariusGedminas das Frustrierendste bei PDB! Wäre schön wenn ihr Befehle mussten vorangestellt werden …

    – Ian Clark

    22. April 2015 um 7:31 Uhr

  • Hinweis: Strg-D scheint der richtige Weg zum Beenden zu sein interact auch, aber es funktioniert nicht gut mit Spyder für mich.

    – Josiah Yoder

    8. Juni 2018 um 19:40 Uhr

Benutzer-Avatar
vaer-k

Bei python3 ipdb (und pdb) haben einen aufgerufenen Befehl interagieren. Es kann verwendet werden für:

Starten Sie einen interaktiven Interpreter (mit der Code Modul), dessen globaler Namensraum alle (globalen und lokalen) Namen enthält, die im aktuellen Gültigkeitsbereich gefunden werden.

Um es zu verwenden, geben Sie einfach ein interact an der pdb-Eingabeaufforderung. Unter anderem ist es nützlich, um Code anzuwenden, der sich über mehrere Zeilen erstreckt, und auch um das versehentliche Auslösen anderer pdb-Befehle zu vermeiden.

  • Es gibt mir “NameError: name ‘interact’ is not defined” wenn ich das tue.

    – Jason

    14. Dezember 2017 um 4:10 Uhr

  • @jason Version 3.2 oder höher

    – vaer-k

    14. Dezember 2017 um 4:13 Uhr

  • Das erklärt. Ich war in Python 2.7.

    – Jason

    14. Dezember 2017 um 6:49 Uhr

  • Vorsicht, dies hat tatsächlich einen Fehler ausgelöst, der interagieren könnte, ist nicht definiert und hat den Prozess beendet

    – Camron_Godbout

    27. Januar 2018 um 14:15 Uhr

  • Ich denke, vorschlagen, zu vermeiden interact ist ein Vorschlag zu stark. Zu 90 % ist das alles, was ich jemals brauche, und es ist viel einfacher zu tippen als from IPython import embed; embed()

    – vaer-k

    7. Februar 2020 um 20:18 Uhr

Benutzer-Avatar
fx-kirin

Meine Empfehlung ist die Verwendung von IPython-Einbettung.

ipdb> from IPython import embed; embed()

  • Wenn Sie einen Wert nicht definierten Fehler im Listenverständnis haben, versuchen Sie, ihn von IPython zu verwenden import embed; embed(user_ns=locals()).

    – fx-kirin

    29. Januar 2019 um 5:41 Uhr

  • das funktioniert für mich viel besser als die akzeptierte Antwort. Zum Beispiel – es ermöglicht die korrekte Bearbeitung von Mehrzeilen – wie das Zurückgehen einiger Zeilen und das Korrigieren von etwas, sodass Sie nicht Ihren gesamten mehrzeiligen Ausdruck erneut schreiben müssen … Ich gebe die Einheimischen als @fx-kirin weiter empfohlen.

    – ZeDuS

    12. November 2019 um 8:05 Uhr


Innerhalb des Python (2.7.1)-Interpreters oder -Debuggers (import pdb) können Sie eine mehrzeilige Anweisung mit der folgenden Syntax ausführen.

for i in range(5): print("Hello"); print("World"); print(i)

Hinweis: Wenn ich mich im Interpreter befinde, muss ich zweimal die Eingabetaste drücken, bevor der Code ausgeführt wird. Im Debugger muss ich jedoch nur einmal die Eingabetaste drücken.

Es gibt den Sonderfall, wenn Sie möchten, dass beim Erreichen eines Haltepunkts einige Befehle ausgeführt werden. Dann gibt es den Debugger-Befehl commands. Sie können mehrere Befehlszeilen eingeben und dann die gesamte Sequenz mit beenden end Stichwort. Mehr mit (pdb) help commands.

Ich weiß nicht, ob Sie dies tun können, das wäre jedoch eine großartige Funktion für ipdb. Sie können natürlich Listenverständnisse verwenden und einfache mehrzeilige Ausdrücke ausführen wie:

if y == 3: print y; print y; print y;

Sie könnten auch vorher einige Funktionen schreiben, um alles zu tun, was Sie tun müssen, was normalerweise mehrere Zeilen dauern würde.

1037860cookie-checkSo führen Sie mehrzeilige Anweisungen in Pythons eigenem Debugger (PDB) aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy