2009-07-20 13 views

Antwort

213

Hier ist ein Beispiel für den Stapel über das traceback Modul bekommen, und drucken:

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 wirklich nur den Stapel ausdrucken möchten, in stderr Sie verwenden können:

traceback.print_stack() 

Oder um auf stdout zu drucken (nützlich, wenn die umgeleitete Ausgabe zusammen beibehalten werden soll), verwenden Sie:

traceback.print_stack(file=sys.stdout) 

Aber über traceback.format_stack() können Sie damit machen, was Sie wollen.

+8

Als string: 'stack_str = '' .join (traceback.format_stack())' – scottmrogowski

+0

Wie das gleiche für alle anderen Threads tun * (I‘ Ich spreche über Threads, die ich nicht kontrolliere) *? – user2284570

+0

Vielleicht verpasse ich hier etwas, aber du rufst f an, es ist nur Zweck, hier ist g anzurufen und tut nichts anderes. Warum – Chris

69
import traceback 
traceback.print_stack() 
+6

Eigentlich mag ich 'traceback.print_exc()', was Ihnen fast das gleiche gibt, was Sie ohne die 'except'-Anweisung bekommen hätten (und ist auch weniger codierend als die akzeptierte Antwort). – martineau

+22

'traceback.print_exc()' druckt den Stack-Trace für jede Exception, die Sie bearbeiten könnten - aber das löst nicht die ursprüngliche Frage, wie der _current_ stack ("wo Sie jetzt sind" im Gegensatz zu "where") gedruckt wird Ihr Code war, wenn die letzte Ausnahme ausging, falls überhaupt. " –

20

inspect.stack() gibt den aktuellen Stapel und nicht die Ausnahme Zurückverfolgungs:

import inspect 
print inspect.stack() 

Siehe https://gist.github.com/FredLoney/5454553 für eine log_stack Nutzenfunktion.

8

Wenn Sie Python-Debugger verwenden, nicht nur interaktives Sondieren von Variablen, aber Sie können den Aufruf-Stack mit dem "wo" -Befehl oder "w" erhalten.

So an der Spitze des Programms

import pdb 

dann in dem Code, wo Sie sehen wollen, was

pdb.set_trace() 

und Sie in eine Eingabeaufforderung

+0

Ich habe seit über einem Jahrzehnt in Python programmiert. Es gibt * so * viele Male hätte ich das benutzen können! Ich kann nicht glauben, dass ich gerade erst davon erfahren habe. – hosford42

0

erhalten fallen gelassen geschieht hier ein Variation von @ RichieHindles ausgezeichneter Antwort, die einen Dekorator implementiert, der selektiv auf Funktionen wie gewünscht 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 Beispiel:

test_func() called: 
    File "stacktrace_decorator.py", line 28, in <module> 
    print(test_func()) 
42 
Verwandte Themen