programas - Imprima la pila de llamadas actual desde un método en código Python
más de 400 ejercicios de programación en python pdf (5)
En Python, ¿cómo puedo imprimir la pila de llamadas actual desde un método (para propósitos de depuración)?
Aquí hay un ejemplo de cómo obtener la pila a través del módulo de traceback e imprimirla:
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 realmente solo quieres imprimir la pila a stderr, puedes usar:
traceback.print_stack()
O para imprimir a la salida estándar (útil si desea mantener la salida redirigida a la vez), use:
traceback.print_stack(file=sys.stdout)
Pero obtenerlo a través de traceback.format_stack()
te permite hacer lo que quieras con él.
Aquí hay una variación de la excelente respuesta de @ RichieHindle que implementa un decorador que puede aplicarse selectivamente a las funciones como se desee. Funciona con Python 2.7.14 y 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())
Salida de la muestra:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
Si usa el depurador de Python, no solo el sondeo interactivo de variables, sino que también puede obtener la pila de llamadas con el comando "where" o "w".
Así que en la parte superior de tu programa.
import pdb
Luego en el código donde quieres ver lo que está sucediendo.
pdb.set_trace()
y te caes en un aviso
inspect.stack()
devuelve la pila actual en lugar del seguimiento de excepciones:
import inspect
print inspect.stack()
Vea https://gist.github.com/FredLoney/5454553 para una función de utilidad log_stack.
import traceback
traceback.print_stack()