从Python代码中的方法打印当前调用堆栈


Answers:


319

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


如何对所有其他线程执行相同操作(我说的是我无法控制的线程)  ?
user2284570

也许我在这里丢失了一些东西,但是您调用f,这唯一的目的是调用g而没有执行其他任何操作。为什么
克里斯

6
@克里斯:这只是一个例子。它具有多种功能,可以清楚地知道format_stack()打印堆栈上的所有调用。
RichieHindle

如果您想获得更多详细输出(包括vars等),请参阅此相关问题,以及问题
艾伯特

@ user2284570:可以使用sys._current_frames()。例如py_better_exchook可以dump_all_thread_tracebacks做到这一点(免责声明:我是写的)。
艾伯特

93
import traceback
traceback.print_stack()

8
实际上,我喜欢traceback.print_exc()它为您提供了几乎无需except声明即可获得的相同功能(并且编码少于接受的答案)。
martineau,2010年

34
traceback.print_exc()打印您可能正在处理的任何异常的堆栈跟踪信息-但这不能解决原始问题,即如何打印当前堆栈(“您现在所在的位置”,而不是“上一次异常发生时代码所在的位置”)关闭,如果有的话。)
汤姆·斯威利


17

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

因此,在程序顶部

import pdb

然后在代码中您要查看发生了什么

pdb.set_trace()

并提示您


2
我从事Python编程已有十多年了。有这样我可以用很多次!我真不敢相信我现在才知道。
hosford42

1
这有where什么关系?
skia.heliou

4
要回答问题的“ where”部分:在得到pdb提示符后(pdb) ,键入where,它将堆栈跟踪信息打印到终端。
stephenmm '18 -10-10

1
Python 3.7及更高版本具有内置函数breakpoint(),从而无需导入pdb。
user650654

6

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

(Pdb) where

2

这是@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

在看到此内容之前,请先编写自己的装饰器版本。已投票。
Sida Zhou

0

安装检查

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()])

你可以做这行的片段

它会向您显示函数调用堆栈的列表,其中包含文件名和行号

从头到尾放置此行的列表

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.