No Python, como posso imprimir a pilha de chamadas atual de dentro de um método (para fins de depuração).
No Python, como posso imprimir a pilha de chamadas atual de dentro de um método (para fins de depuração).
Respostas:
Aqui está um exemplo de como obter a pilha através do módulo traceback e imprimi-la:
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():
Se você realmente deseja apenas imprimir a pilha no stderr, pode usar:
traceback.print_stack()
Ou para imprimir em stdout (útil se desejar manter a saída redirecionada em conjunto), use:
traceback.print_stack(file=sys.stdout)
Mas obtê-lo via traceback.format_stack()
permite fazer o que quiser com ele.
sys._current_frames()
. Por exemplo, py_better_exchookdump_all_thread_tracebacks
faz isso (aviso: eu escrevi isso).
import traceback
traceback.print_stack()
traceback.print_exc()
que lhe dá quase a mesma coisa que você obteria sem a except
declaração (e também é menos codificadora do que a resposta aceita).
traceback.print_exc()
imprime o rastreamento de pilha para qualquer exceção que você possa estar manipulando - mas isso não resolve a questão original, que é como imprimir a pilha atual ("onde você está agora", em vez de "onde estava o seu código quando a última exceção ocorreu" off, se houver ".)
inspect.stack()
retorna a pilha atual em vez da exceção traceback:
import inspect
print inspect.stack()
Consulte https://gist.github.com/FredLoney/5454553 para obter uma função do utilitário log_stack.
Se você usar o depurador python, não apenas investigará interativamente as variáveis, mas poderá obter a pilha de chamadas com o comando "where" ou "w".
Então, no topo do seu programa
import pdb
Em seguida, no código em que você deseja ver o que está acontecendo
pdb.set_trace()
e você cai em um prompt
where
?
(pdb)
digite where
e ele imprimirá o rastreamento da pilha no terminal.
breakpoint()
que evita a necessidade de importar o pdb.
para quem precisa imprimir a pilha de chamadas enquanto usa o pdb, basta
(Pdb) where
Aqui está uma variação da excelente resposta do @ RichieHindle, que implementa um decorador que pode ser aplicado seletivamente às funções conforme desejado. Funciona com o Python 2.7.14 e 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())
Saída da amostra:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Instale o Inspecione
pip3 install inspect-it --user
Código
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()])
você pode criar um trecho dessa linha
mostrará uma lista da pilha de chamadas de função com um nome de arquivo e um número de linha
lista do início até onde você coloca esta linha