Печать текущего стека вызовов из метода в коде Python
197 oneself [2009-07-21 00:24:00]
В Python, как я могу напечатать текущий стек вызовов из метода (для целей отладки).
python debugging stack-trace
5 ответов
225 Решение RichieHindle [2009-07-21 00:27:00]
Вот пример получения стека через модуль 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()
Или для печати в stdout (полезно, если хотите сохранить перенаправленный вывод вместе), используйте:
traceback.print_stack(file=sys.stdout)
Но получение его через traceback.format_stack()
позволяет вам делать с ним все, что вам нравится.
71 Mark Roddy [2009-07-21 00:28:00]
import traceback
traceback.print_stack()
22 Fred Loney [2013-04-24 22:37:00]
inspect.stack()
возвращает текущий стек, а не трассировку исключения:
import inspect
print inspect.stack()
См. https://gist.github.com/FredLoney/5454553 для функции утилиты log_stack.
8 Keir [2016-10-23 23:47:00]
Если вы используете отладчик python, а не только интерактивное зондирование переменных, но вы можете получить стек вызовов с помощью команды "where" или "w".
Итак, в верхней части вашей программы
import pdb
Затем в коде, где вы хотите увидеть, что происходит
pdb.set_trace()
и вы попадаете в приглашение
0 martineau [2018-02-07 01:42:00]
Здесь вариация превосходного ответа @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