355

在 Python 中,如何从方法中打印当前调用堆栈(出于调试目的)。

4

7 回答 7

398

这是通过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()可以让您随心所欲地使用它。

于 2009-07-20T21:27:43.907 回答
119
import traceback
traceback.print_stack()
于 2009-07-20T21:28:14.013 回答
55

inspect.stack()返回当前堆栈而不是异常回溯:

import inspect
print inspect.stack()

有关 log_stack 实用程序功能,请参阅https://gist.github.com/FredLoney/5454553

于 2013-04-24T19:37:20.370 回答
39

对于那些在使用 pdb 时需要打印调用堆栈的人,只需执行

(Pdb) where
于 2020-01-24T10:41:59.903 回答
19

如果您使用 python 调试器,不仅可以交互式探测变量,还可以使用“where”命令或“w”获取调用堆栈。

所以在你的程序的顶部

import pdb

然后在你想看看发生了什么的代码中

pdb.set_trace()

然后你会进入提示

于 2016-10-23T20:47:36.447 回答
3

这是@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
于 2018-02-06T22:42:54.163 回答
2

安装检查它

pip3 install inspect-it --user

代码

import inspect;print(*['\n\x1b[0;36;1m| \x1b[0;32;1m{:25}\x1b[0;36;1m| \x1b[0;35;1m{}'.format(str(x.function), x.filename+'\x1b[0;31;1m:'+str(x.lineno)+'\x1b[0m') for x in inspect.stack()])

你可以制作这一行的片段

它将向您显示带有文件名和行号的函数调用堆栈列表

列出从开始到您放置此行的位置

于 2019-07-05T05:49:43.200 回答