In Python, wie kann ich den aktuellen Aufrufstapel innerhalb einer Methode ausgeben (zum Debuggen).
Wie mache ich dasselbe für alle anderen Threads (ich meine Threads, die ich nicht kontrolliere)?
In Python, wie kann ich den aktuellen Aufrufstapel innerhalb einer Methode ausgeben (zum Debuggen).
Hier ist ein Beispiel, wie Sie den Stack über das traceback Modul erhalten und ihn ausgeben können:
import traceback
def f():
g()
def g():
for line in traceback.format_stack():
print(line.strip())
f()
# Gibt aus:
# Datei "so-stack.py", Zeile 10, in
# f()
# Datei "so-stack.py", Zeile 4, in f
# g()
# Datei "so-stack.py", Zeile 7, in g
# for line in traceback.format_stack():
Wenn Sie wirklich nur den Stack auf stderr ausgeben möchten, können Sie folgendes verwenden:
traceback.print_stack()
Oder um auf stdout auszugeben (nützlich, wenn Sie die umgeleitete Ausgabe zusammenhalten möchten), verwenden Sie:
traceback.print_stack(file=sys.stdout)
Aber über traceback.format_stack()
können Sie damit machen, was Sie möchten.
Wie mache ich dasselbe für alle anderen Threads (ich meine Threads, die ich nicht kontrolliere)?
Vielleicht fehlt mir hier etwas, aber du rufst f auf, dessen einziger Zweck es hier ist, g aufzurufen und nichts weiter zu tun. Warum
@Chris: Es ist nur ein Beispiel. Es hat mehrere Funktionen, um klarzustellen, dass format_stack() alle Aufrufe auf dem Stack druckt.
Eigentlich mag ich traceback.print_exc()
, was dir fast das gleiche gibt, was du ohne die except
-Anweisung bekommen hättest (und auch weniger Code ist als die akzeptierte Antwort).
traceback.print_exc()
gibt den Stapelrückverfolgung für jede Ausnahme aus, die Sie möglicherweise behandeln - aber das löst nicht die ursprüngliche Frage, wie man den aktuellen Stapel ("wo Sie sich jetzt befinden" im Gegensatz zu "wo sich Ihr Code befand, als die letzte Ausnahme ausgelöst wurde, wenn überhaupt".) ausdrucken kann.
inspect.stack()
gibt den aktuellen Stack zurück, anstatt des Ausnahmefehler-Tracebacks:
import inspect
print inspect.stack()
Siehe https://gist.github.com/FredLoney/5454553 für eine log_stack Hilfsfunktion.
Wenn Sie den Python-Debugger verwenden, können Sie nicht nur interaktiv Variablen überprüfen, sondern auch den Aufrufstapel mit dem Befehl "where" oder "w" erhalten.
Also am Anfang Ihres Programms
import pdb
Dann im Code, an der Stelle, an der Sie sehen möchten, was passiert
pdb.set_trace()
und Sie gelangen in eine Eingabeaufforderung
Ich programmiere seit über einem Jahrzehnt in Python. Es gibt so viele Male, in denen ich das hätte verwenden können! Ich kann nicht glauben, dass ich es jetzt erst entdecke.
Um den "wo" Teil der Frage zu beantworten: Nachdem Sie die pdb-Aufforderung (pdb)
erhalten haben, tippen Sie einfach where
ein und es wird der Stack-Trace auf dem Terminal gedruckt.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.