Réponses:
Voici un exemple pour obtenir la pile via le module traceback et 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 ne voulez vraiment imprimer que la pile sur 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.
sys._current_frames()
. Par exemple, py_better_exchookdump_all_thread_tracebacks
fait cela (avertissement: j'ai écrit cela).
import traceback
traceback.print_stack()
traceback.print_exc()
ce qui vous donne presque la même chose que vous auriez obtenue sans l' except
énoncé (et est également moins codant que la réponse acceptée).
traceback.print_exc()
imprime la trace de la pile pour toute exception que vous pourriez gérer - mais cela ne résout pas la question d'origine, qui est de savoir comment imprimer la pile actuelle ("où vous êtes maintenant" par opposition à "où était votre code lors de la dernière exception) off, if any ".)
inspect.stack()
renvoie la pile actuelle plutôt que l'exception traceback:
import inspect
print inspect.stack()
Voir https://gist.github.com/FredLoney/5454553 pour une fonction utilitaire log_stack.
Si vous utilisez le débogueur python, non seulement le sondage interactif des variables, mais vous pouvez obtenir la pile d'appels avec la commande "where" ou "w".
Donc en haut de votre programme
import pdb
Ensuite, dans le code où vous voulez voir ce qui se passe
pdb.set_trace()
et vous êtes tombé dans une invite
where
t-il?
(pdb)
simplement where
et il imprimera la trace de la pile sur le terminal.
breakpoint()
qui évite d'avoir à importer pdb.
pour ceux qui ont besoin d'imprimer la pile d'appels tout en utilisant pdb, faites simplement
(Pdb) where
Voici une variation de l'excellente réponse de @ RichieHindle qui implémente un décorateur qui peut être appliqué sélectivement aux fonctions comme vous le souhaitez. Fonctionne avec Python 2.7.14 et 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())
Sortie de l'échantillon:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Installez 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()])
vous pouvez créer un extrait de cette ligne
il vous montrera une liste de la pile d'appels de fonction avec un nom de fichier et un numéro de ligne
liste du début à l'endroit où vous mettez cette ligne