356 votes

Imprimer la pile d'appels en cours en Python

En Python, comment puis-je imprimer la pile d'appels en cours depuis une méthode (à des fins de débogage)?

401voto

RichieHindle Points 98544

Voici un exemple d’obtention de la pile via le module traceback et de l’imprimer:

 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():
 

Si vous voulez vraiment imprimer la pile au format stderr, vous pouvez utiliser:

 traceback.print_stack()
 

Ou pour imprimer sur stdout (utile si vous souhaitez conserver la sortie redirigée ensemble), utilisez:

 traceback.print_stack(file=sys.stdout)
 

Mais l'obtenir via traceback.format_stack() vous permet de faire ce que vous voulez avec.

119voto

Mark Roddy Points 7568
import traceback
traceback.print_stack()

55voto

Fred Loney Points 46

inspect.stack() renvoie la pile en cours plutôt que la trace de l'exception:

 import inspect
print inspect.stack()
 

Voir https://gist.github.com/FredLoney/5454553 pour une fonction utilitaire log_stack.

0voto

Paolo Points 2489

J'aime juste avoir les appels de fonction enregistrés dans une chaîne globale call_stack

 import traceback

call_stack = ''

def save_call_stack():
    global call_stack
    call_stack = ''
    s=traceback.format_stack()
    for i in range(len(s)-1):
        l = s[i]
        call_stack += l[l.find('\n')+1:-1]
    call_stack = call_stack.strip()
    # cut to 253 characters (optional)
    if len(call_stack)>250:
        call_stack = '...' + call_stack[-250:]
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X