在 Python 中,如何从方法中打印当前调用堆栈(出于调试目的)。
下面是通过 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()
或者打印到标准输出(如果想保持重定向输出一起有用),使用:
traceback.print_stack(file=sys.stdout)
但是通过 traceback.format_stack()
获取它可以让您随心所欲地使用它。
import traceback
traceback.print_stack()
traceback.print_exc()
,它给你的东西几乎与没有 except
语句的情况相同(而且编码也比接受的答案少)。
traceback.print_exc()
打印您可能正在处理的任何异常的堆栈跟踪 - 但这并不能解决原始问题,即如何打印 current 堆栈(“您现在所在的位置”而不是“最后一次异常发生时你的代码在哪里,如果有的话”。)
inspect.stack()
返回当前堆栈而不是异常回溯:
import inspect
print inspect.stack()
有关 log_stack 实用程序函数,请参见 https://gist.github.com/FredLoney/5454553。
对于那些在使用 pdb 时需要打印调用堆栈的人,只需执行
(Pdb) where
如果您使用 python 调试器,不仅可以交互式探测变量,还可以使用“where”命令或“w”获取调用堆栈。
所以在你的程序的顶部
import pdb
然后在你想看看发生了什么的代码中
pdb.set_trace()
然后你会进入提示
where
有何关系?
(pdb)
后,只需键入 where
,它就会将堆栈跟踪打印到终端。
breakpoint()
,它消除了导入 pdb 的需要。
这是@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
安装检查它
pip3 install inspect-it --user
代码
import inspect;print(*['{:40}| {}:{}\n'.format(x.function, x.filename, x.lineno) for x in inspect.stack()])
你可以制作这一行的片段
它将向您显示带有文件名和行号的函数调用堆栈列表
列出从开始到您放置此行的位置
sys._current_frames()
。例如 py_better_exchookdump_all_thread_tracebacks
这样做(免责声明:我写了那个)。