Wie kann ich in Python den aktuellen Aufrufstapel aus einer Methode heraus drucken (zu Debugging-Zwecken)?
Wie kann ich in Python den aktuellen Aufrufstapel aus einer Methode heraus drucken (zu Debugging-Zwecken)?
Antworten:
Hier ist ein Beispiel, wie Sie den Stapel über das Traceback- Modul abrufen und drucken können:
import traceback
def f():
g()
def g():
for line in traceback.format_stack():
print(line.strip())
f()
# Prints:
# File "so-stack.py", line 10, in <module>
# f()
# File "so-stack.py", line 4, in f
# g()
# File "so-stack.py", line 7, in g
# for line in traceback.format_stack():
Wenn Sie den Stapel wirklich nur auf stderr drucken möchten, können Sie Folgendes verwenden:
traceback.print_stack()
Oder verwenden Sie zum Drucken auf Standardausgabe (nützlich, wenn Sie die umgeleitete Ausgabe zusammenhalten möchten):
traceback.print_stack(file=sys.stdout)
Aber traceback.format_stack()
wenn Sie es über bekommen, können Sie damit machen, was Sie wollen.
sys._current_frames()
. Zumdump_all_thread_tracebacks
Beispiel macht py_better_exchook das (Haftungsausschluss: Das habe ich geschrieben).
import traceback
traceback.print_stack()
traceback.print_exc()
, was Ihnen fast das gleiche gibt, was Sie ohne die except
Aussage bekommen hätten (und auch weniger codiert als die akzeptierte Antwort).
traceback.print_exc()
druckt die Stapelverfolgung für jede Ausnahme, die Sie möglicherweise behandeln - dies löst jedoch nicht die ursprüngliche Frage, wie der aktuelle Stapel gedruckt werden soll ("wo Sie sich jetzt befinden" im Gegensatz zu "wo sich Ihr Code befand, als die letzte Ausnahme aufgetreten ist" aus, wenn überhaupt ".)
inspect.stack()
Gibt den aktuellen Stapel anstelle des Ausnahme-Tracebacks zurück:
import inspect
print inspect.stack()
Unter https://gist.github.com/FredLoney/5454553 finden Sie eine Dienstprogrammfunktion für log_stack.
Wenn Sie den Python-Debugger verwenden, können Sie nicht nur Variablen interaktiv prüfen, sondern den Aufrufstapel auch mit dem Befehl "where" oder "w" abrufen.
Also ganz oben in Ihrem Programm
import pdb
Dann im Code, wo Sie sehen möchten, was passiert
pdb.set_trace()
und Sie werden in eine Eingabeaufforderung fallen gelassen
where
?
(pdb)
einfach ein where
und der Stack-Trace wird auf dem Terminal gedruckt.
breakpoint()
die den Import von pdb überflüssig macht.
Für diejenigen, die den Aufrufstapel drucken müssen, während sie pdb verwenden, tun Sie dies einfach
(Pdb) where
Hier ist eine Variation von @ RichieHindles hervorragender Antwort, die einen Dekorateur implementiert, der selektiv auf gewünschte Funktionen angewendet werden kann. Funktioniert mit Python 2.7.14 und 3.6.4.
from __future__ import print_function
import functools
import traceback
import sys
INDENT = 4*' '
def stacktrace(func):
@functools.wraps(func)
def wrapped(*args, **kwds):
# Get all but last line returned by traceback.format_stack()
# which is the line below.
callstack = '\n'.join([INDENT+line.strip() for line in traceback.format_stack()][:-1])
print('{}() called:'.format(func.__name__))
print(callstack)
return func(*args, **kwds)
return wrapped
@stacktrace
def test_func():
return 42
print(test_func())
Ausgabe von Probe:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Installieren Sie Inspect-it
pip3 install inspect-it --user
Code
import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])
Sie können einen Ausschnitt aus dieser Zeile erstellen
Es zeigt Ihnen eine Liste des Funktionsaufrufstapels mit einem Dateinamen und einer Zeilennummer
Liste von Anfang bis wo Sie diese Zeile setzen