resueltos programas programación practicos más mundo hola hechos ejercicios ejemplos ejemplo codigos avanzados python debugging stack-trace

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()