打印python堆栈跟踪,无异常被引发

Cla*_*diu 57 python debugging stack-trace

我的一个类的实例变量正在发生一些事情.我想让变量成为一个属性,无论何时访问它,我都要打印出导致该点的所有代码的堆栈跟踪,这样我就可以看到它被搞乱了.如果没有引发异常,如何打印堆栈跟踪?我知道如果有例外,我可以做类似的事情traceback.format_tb(sys.exc_info()[2]).

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

小智 82

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
Run Code Online (Sandbox Code Playgroud)

编辑:您还可以使用extract_stack,获取切片(例如stack[5:],排除前5个级别)并使用format_list获取打印就绪的堆栈跟踪('\n'.join(traceback.format_list(...)))

  • 感谢您的编辑,它帮助我解决了 [this answer](http://stackoverflow.com/a/16589622/321973) 一个非常通用的 `full_stack()` 函数! (2认同)

rou*_*ble 6

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

''.join(traceback.format_stack())
Run Code Online (Sandbox Code Playgroud)

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

''.join(traceback.format_stack()[-N:])
Run Code Online (Sandbox Code Playgroud)

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