打印python堆栈跟踪而无异常


70

我的类的实例变量之一正在发生某些事情。我想使变量成为一个属性,并且每当访问该变量时,我都希望打印出导致该点的所有代码的堆栈跟踪,因此我可以看到它的混乱之处。没有引发异常时,如何打印堆栈跟踪?我知道是否有例外,我可以做类似的事情traceback.format_tb(sys.exc_info()[2])

同样有用的是仅打印最后3-4个级别,因为前几个级别可能不会那么有趣。

Answers:


99

traceback.print_stack()

>>> 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获得可打印的stacktrace('\n'.join(traceback.format_list(...))


2
感谢您的编辑,它帮助我这个答案的一个非常普遍的full_stack()功能!
Tobias Kienzler

13

如果您需要将字符串传递给记录器,则可以使用:

''.join(traceback.format_stack())

请注意,traceback.format_stack()将堆栈跟踪作为格式化的字符串列表返回,因此您可以随时对其进行切片。要获取stacktrace的最后几个元素,您可以执行以下操作:

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

其中N是您感兴趣的级别数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.