459 Stimmen

Drucken Sie den aktuellen Aufrufstapel aus einer Methode im Code.

In Python, wie kann ich den aktuellen Aufrufstapel innerhalb einer Methode ausgeben (zum Debuggen).

516voto

RichieHindle Punkte 256891

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.

0 Stimmen

Wie mache ich dasselbe für alle anderen Threads (ich meine Threads, die ich nicht kontrolliere)?

0 Stimmen

Vielleicht fehlt mir hier etwas, aber du rufst f auf, dessen einziger Zweck es hier ist, g aufzurufen und nichts weiter zu tun. Warum

9 Stimmen

@Chris: Es ist nur ein Beispiel. Es hat mehrere Funktionen, um klarzustellen, dass format_stack() alle Aufrufe auf dem Stack druckt.

157voto

Mark Roddy Punkte 25266
import traceback
traceback.print_stack()

8 Stimmen

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).

50 Stimmen

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.

3 Stimmen

Es kann nützlich sein, die Spuren auf eine bestimmte Anzahl von Einträgen zu begrenzen, z. B.: traceback.print_stack(limit=4)

116voto

mouserat Punkte 1107

Für diejenigen, die den Aufrufstapel beim Verwenden von pdb ausdrucken müssen, einfach tun

(Pdb) where

82voto

Fred Loney Punkte 681

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.

4 Stimmen

Sollte viel mehr Stimmen haben, überprüfen fühlt sich viel besser an.

23voto

Keir Punkte 467

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

2 Stimmen

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.

3 Stimmen

Wie hängt das mit wo zusammen?

4 Stimmen

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.com

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.

Powered by:

X