Python-Stack-Trace drucken, ohne dass eine Ausnahme ausgelöst wird

70

Mit einer der Instanzvariablen meiner Klasse passiert etwas. Ich möchte die Variable zu einer Eigenschaft machen, und bei jedem Zugriff möchte ich den Stack-Trace des gesamten Codes ausdrucken, der bis zu diesem Punkt führt, damit ich sehen kann, wo er durcheinander gebracht wird. Wie drucke ich den Stack-Trace aus, wenn keine Ausnahme ausgelöst wurde? Ich weiß, wenn es eine Ausnahme gibt, kann ich so etwas tun traceback.format_tb(sys.exc_info()[2]).

Es könnte auch nützlich sein, nur die letzten 3-4 Ebenen zu drucken, da die ersten wahrscheinlich nicht so interessant sein werden.

Claudiu
quelle

Antworten:

99

traceback.print_stack()::

>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g

Bearbeiten: Sie können auch extract_stack verwenden , ein Slice nehmen (z. B. stack[5:]um die ersten 5 Ebenen auszuschließen) und format_list verwenden , um eine druckfertige Stacktrace ( '\n'.join(traceback.format_list(...))) zu erhalten.


quelle
2
Vielen Dank für die Bearbeitung, es hat mir bei dieser Antwort für eine sehr allgemeine full_stack()Funktion geholfen !
Tobias Kienzler
13

Anstatt nach stdout zu drucken, können Sie Folgendes verwenden, wenn Sie eine Zeichenfolge benötigen, die an einen Logger übergeben werden soll:

''.join(traceback.format_stack())

Beachten Sie, dass traceback.format_stack () den Stacktrace als formatierte Liste von Zeichenfolgen zurückgibt, sodass Sie ihn beliebig aufteilen können. Um die letzten Elemente des Stacktraces zu erhalten, können Sie Folgendes tun:

''.join(traceback.format_stack()[-N:])

Wobei N die Anzahl der Ebenen ist, an denen Sie interessiert sind.

Rubel
quelle