从代码中的方法打印当前调用堆栈
- 2025-03-18 08:55:00
- admin 原创
- 42
问题描述:
在 Python 中,如何从方法内部打印当前调用堆栈(出于调试目的)。
解决方案 1:
下面是通过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()
你可以用它做任何你想做的事情。
解决方案 2:
import traceback
traceback.print_stack()
解决方案 3:
对于那些需要在使用 pdb 时打印调用堆栈的人来说,只需执行
(Pdb) where
解决方案 4:
inspect.stack()
返回当前堆栈而不是异常回溯:
import inspect
print inspect.stack()
请参阅https://gist.github.com/FredLoney/5454553了解 log_stack 实用函数。
解决方案 5:
如果您使用 python 调试器,不仅可以交互式探测变量,还可以使用“where”命令或“w”获取调用堆栈。
因此,在程序的顶部
import pdb
然后在代码中查看发生了什么
pdb.set_trace()
然后你就会被提示
解决方案 6:
这是 @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 = '
'.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
解决方案 7:
安装Inspect-it
pip3 install inspect-it --user
代码
import inspect
print(*['{:40}| {}:{}
'.format(x.function, x.filename, x.lineno)
for x in inspect.stack()])
你可以制作这一行的片段
它将显示带有文件名和行号的函数调用堆栈列表
从开始到你放置此行的位置列出
解决方案 8:
一个独立的表达式,您可以将其粘贴到要调试的代码中,而无需调整导入:
__import__("traceback").print_stack(file=__import__("sys").stderr)
解决方案 9:
使用walk_stack
方法返回当前堆栈中存储的历史记录(None
):
import traceback
for trace, _ in traceback.walk_stack(None):
print(trace)
print(trace.f_locals)
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD