En Python, ¿cómo puedo imprimir la pila de llamadas actual desde un método (con fines de depuración).Imprimir la pila de llamadas actual de un método en el código de Python
Respuesta
He aquí un ejemplo de conseguir la pila a través del módulo 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 sólo desea imprimir la pila a stderr, puede utilizar:
traceback.print_stack()
O para imprimir en stdout (útil si desea mantener la salida redirigida), use:
traceback.print_stack(file=sys.stdout)
Pero obtenerlo a través de traceback.format_stack()
le permite hacer lo que quiera con él.
import traceback
traceback.print_stack()
En realidad, me gusta 'traceback.print_exc()' que te proporciona casi lo mismo que habrías obtenido sin la instrucción 'except' (y también tiene menos codificación que la respuesta aceptada). – martineau
'traceback.print_exc()' imprime el seguimiento de pila para cualquier excepción que pueda estar manejando, pero esto no resuelve la pregunta original, que es cómo imprimir la pila _current_ ("donde se encuentra ahora" en lugar de "donde su código fue cuando se disparó la última excepción, si hubo alguna ".) –
inspect.stack()
devuelve la pila actual en lugar de la excepción de rastreo:
import inspect
print inspect.stack()
Ver https://gist.github.com/FredLoney/5454553 para una función de utilidad log_stack.
Si utiliza el depurador de Python, no solo el sondeo interactivo de variables sino que puede obtener la pila de llamadas con el comando "where" o "w".
Así que en la parte superior de su programa
import pdb
Luego, en el código en el que desea ver lo que está sucediendo
pdb.set_trace()
y te deja caer en un símbolo del
He estado programando en Python durante más de una década. ¡Hay * así que * muchas veces podría haber usado esto! No puedo creer que ahora me estoy enterando. – hosford42
Aquí hay una variación de la excelente respuesta de @ RichieHindle que implementa un decorador que se puede aplicar de forma selectiva 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())
de salida de la muestra:
test_func() called:
File "stacktrace_decorator.py", line 28, in <module>
print(test_func())
42
- 1. Imprimir pila de llamadas completa en printStackTrace()?
- 2. ¿Qué significa "código externo" en la pila de llamadas?
- 3. Suprimir llamadas para imprimir (python)
- 4. C# obtienen llamadas Método de Seguimiento de la pila Sin
- 5. Imprimir seguimiento de pila en la ventana de salida
- 6. Cómo obtener la pila de pila nativa de las excepciones nativas capturadas en el código administrado
- 7. Llamada al método privado que retiene la pila de llamadas
- 8. Xcode 4.3.2 no mostrará la pila completa de llamadas en el depurador, ¿solo la función actual?
- 9. pila de llamadas en el perfilador Potencia
- 10. "[Función de peso liviano]" en la pila de llamadas
- 11. Llamadas de método en EL
- 12. Consulte la pila de llamadas durante la depuración en Pydev
- 13. C++ obtiene la pila de llamadas de std :: exception
- 14. ¿Cómo imprimir el seguimiento completo de pila en la excepción?
- 15. ¿Manera fácil de imprimir el seguimiento de pila actual de una aplicación?
- 16. Imprimir un seguimiento de pila de otro hilo
- 17. Capture la pila de llamadas rápidamente
- 18. Android: aumentar el tamaño de la pila de llamadas
- 19. Imprimir el seguimiento de la pila de una excepción
- 20. ¿Cómo obtengo el archivo actual, la clase actual y el método actual con Python?
- 21. imprime la pila posterior actual en el registro
- 22. ¿Cómo forzar a la VM de python a imprimir una traza de pila?
- 23. ¿cómo especifico el directorio de código fuente en VS cuando miro la pila de llamadas de un volcado de memoria?
- 24. Control.EndInvoke restablece la pila de llamadas para la excepción
- 25. Al depurar javascript, ¿hay alguna manera de alertar la pila de llamadas actual?
- 26. Mejor método actual para envolver el código de Fortran moderno con Python
- 27. Imprimir la información de seguimiento de la pila de C#
- 28. Xcode: seguimiento de la pila de llamadas en assert?
- 29. Imprimir el seguimiento de pila en C++ (MSVC)?
- 30. ¿Cómo puedo obtener la pila de llamadas en Clojure?
Como cadena: 'stack_str = '' .join (traceback.format_stack())' – scottmrogowski
Cómo hacer el mismo para todos los otros hilos * (I' estoy hablando de hilos que no controlo) *? – user2284570
Tal vez me falta algo aquí, pero llamas a f, que el único propósito es llamar y no hacer nada más. Por qué – Chris