Вывести текущий стек вызовов из метода в коде Python - PullRequest
234 голосов
/ 21 июля 2009

Как в Python я могу напечатать текущий стек вызовов из метода (для целей отладки).

Ответы [ 5 ]

264 голосов
/ 21 июля 2009

Вот пример получения стека через модуль traceback и его печати:

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

Если вы действительно хотите распечатать стопку в stderr, вы можете использовать:

traceback.print_stack()

Или для печати на стандартный вывод (полезно, если вы хотите сохранить перенаправленный вывод вместе), используйте:

traceback.print_stack(file=sys.stdout)

Но получение через traceback.format_stack() позволяет вам делать с ним все что угодно.

81 голосов
/ 21 июля 2009
import traceback
traceback.print_stack()
29 голосов
/ 24 апреля 2013

inspect.stack() возвращает текущий стек, а не трассировку исключения:

import inspect
print inspect.stack()

См. https://gist.github.com/FredLoney/5454553 для служебной функции log_stack.

11 голосов
/ 23 октября 2016

Если вы используете отладчик python, не только интерактивное исследование переменных, но вы можете получить стек вызовов с помощью команды "where" или "w".

Итак, в начале вашей программы

import pdb

Тогда в коде, где вы хотите увидеть, что происходит

pdb.set_trace()

и вы попадете в приглашение

0 голосов
/ 07 февраля 2018

Вот вариант отличного ответа @ RichieHindle, в котором реализован декоратор, который можно выборочно применять к функциям по желанию. Работает с Python 2.7.14 и 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())

Вывод из образца:

test_func() called:
    File "stacktrace_decorator.py", line 28, in <module>
    print(test_func())
42
...