5 ответов:
вот пример получения стека через 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()позволяет делать все, что вам нравится с ним.
inspect.stack()возвращает текущий стек, а не отладочные исключения:import inspect print inspect.stack()см.https://gist.github.com/FredLoney/5454553 для служебной функции log_stack.
Если вы используете отладчик python, не только интерактивное зондирование переменных, но вы можете получить стек вызовов с помощью команды "where" или "w".
Итак, в верхней части вашей программы
import pdbтогда в коде, где вы хотите увидеть, что происходит
pdb.set_trace()и вы попадаете в подсказку
вот вариант отличного ответа @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
Comments