вывести трассировку стека Python без исключения - PullRequest
52 голосов
/ 13 октября 2010

Что-то происходит с одной из переменных экземпляра моего класса. Я хочу сделать переменную свойством, и всякий раз, когда к ней обращаются, я хочу распечатать трассировку стека всего кода, ведущего к этой точке, чтобы я мог видеть, с чем она связана. Как распечатать трассировку стека, если исключение не возникло? Я знаю, если есть исключение, я могу сделать что-то вроде traceback.format_tb(sys.exc_info()[2]).

Также может быть полезно напечатать только последние 3-4 уровня, поскольку первые несколько, вероятно, не будут такими интересными.

Ответы [ 2 ]

76 голосов
/ 13 октября 2010

traceback.print_stack() * * 1004

>>> def f():
...   def g():
...     traceback.print_stack()
...   g()
...
>>> f()
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in f
  File "<stdin>", line 3, in g

Редактировать: Вы также можете использовать extract_stack , взять фрагмент (например, stack[5:] для исключения первых 5 уровней) и использовать format_list для получения готовой к печати трассировки стека ('\n'.join(traceback.format_list(...)))

3 голосов
/ 24 апреля 2018

Вместо печати в стандартный вывод, если вам нужна строка для передачи в регистратор, вы можете использовать:

''.join(traceback.format_stack())

Обратите внимание, что traceback.format_stack () возвращает трассировку стека в виде отформатированного списка строктак что вы можете нарезать его как угодно.Чтобы получить последние несколько элементов стека трассировки, вы можете сделать:

''.join(traceback.format_stack()[-N:])

Где N - количество уровней, которые вас интересуют.

...