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

2025-03-18 08:55:00
admin
原创
42
摘要:问题描述:在 Python 中,如何从方法内部打印当前调用堆栈(出于调试目的)。解决方案 1:下面是通过traceback模块获取堆栈并打印的示例:import traceback def f(): g() def g(): for line in traceback.format_sta...

问题描述:

在 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)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用