Imprimer la pile d'appels courants à partir d'une méthode en code Python

en Python, Comment puis-je imprimer la pile d'appels courante à partir d'une méthode (à des fins de débogage).

203
demandé sur Nickolay 2009-07-21 01:24:05
la source

5 ответов

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 voulez vraiment Imprimer la pile à stderr, vous pouvez utiliser:

traceback.print_stack()

ou pour imprimer vers stdout (utile si vous voulez garder la sortie redirigée ensemble), utilisez:

traceback.print_stack(file=sys.stdout)

mais l'obtenir via traceback.format_stack() vous permet de faire tout ce que vous voulez avec elle.

232
répondu RichieHindle 2015-10-26 10:34:26
la source
import traceback
traceback.print_stack()
74
répondu Mark Roddy 2009-07-21 01:28:14
la source

inspect.stack() renvoie la pile courante plutôt que l'exception traceback:

import inspect
print inspect.stack()

voir https://gist.github.com/FredLoney/5454553 pour une fonction utilitaire log_stack.

24
répondu Fred Loney 2013-04-24 23:37:20
la source

si vous utilisez le débogueur python, non seulement l'exploration interactive des variables, mais vous pouvez obtenir la pile d'appels avec la commande" où "ou"w".

Donc en haut de votre programme

import pdb

, Puis dans le code où vous voulez voir ce qui se passe

pdb.set_trace()

et vous tombez dans un prompt

9
répondu Keir 2016-10-23 23:47:36
la source

voici une variante de l'excellente réponse de @RichieHindle qui implémente un décorateur qui peut être appliqué sélectivement aux fonctions comme désiré. 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
0
répondu martineau 2018-02-07 01:42:54
la source

Autres questions sur python debugging stack-trace