En Python, comment puis-je imprimer la pile d'appels en cours depuis une méthode (à des fins de débogage)?
Réponses
Trop de publicités?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.
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.
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:]