首页 > 编程语言 >python debug

python debug

时间:2024-12-12 19:10:00浏览次数:5  
标签:调用 File python py func debug example def

python debug

在 Python 中,查看程序的调用栈(call stack)可以帮助你调试代码,了解函数调用的顺序和上下文。以下是查看 Python 调用栈的常用方法。

1. 使用 traceback 模块

traceback 是 Python 标准库模块,可用于打印异常发生时的调用栈或程序的当前调用栈。

示例:打印当前调用栈

import traceback

def func_a():
    func_b()

def func_b():
    func_c()

def func_c():
    print("Current Call Stack:")
    traceback.print_stack()  # 打印当前调用栈

func_a()

============================================
输出示例:

Current Call Stack:
  File "example.py", line 11, in <module>
    func_a()
  File "example.py", line 4, in func_a
    func_b()
  File "example.py", line 7, in func_b
    func_c()
  File "example.py", line 10, in func_c
    traceback.print_stack()

常用的函数:
traceback.print_stack(): 打印当前调用栈。
traceback.format_stack(): 返回调用栈的字符串列表,可以在日志中记录。

2. 使用 inspect 模块

inspect 模块可以提供对调用栈的详细信息,包括函数名、文件名、行号等。

示例:获取并打印当前调用栈

import inspect

def func_a():
    func_b()

def func_b():
    func_c()

def func_c():
    stack = inspect.stack()
    print("Current Call Stack:")
    for frame in stack:
        print(f"Function: {frame.function}, Line: {frame.lineno}, File: {frame.filename}")

func_a()

=====================================================
输出示例:

Current Call Stack:
Function: func_c, Line: 10, File: example.py
Function: func_b, Line: 7, File: example.py
Function: func_a, Line: 4, File: example.py
Function: <module>, Line: 13, File: example.py

常用的函数:
inspect.stack(): 获取调用栈,返回一个 FrameInfo 对象列表。
inspect.currentframe(): 获取当前帧对象,配合 .f_back 可以遍历调用栈。

3. 在异常处理时查看调用栈

当程序抛出异常时,可以通过 traceback 查看异常发生时的调用栈。

示例:捕获异常并打印调用栈

import traceback

def func_a():
    func_b()

def func_b():
    func_c()

def func_c():
    raise ValueError("An error occurred!")

try:
    func_a()
except Exception as e:
    print("Exception Call Stack:")
    traceback.print_exc()  # 打印异常的调用栈

========================================
输出示例:

Exception Call Stack:
Traceback (most recent call last):
  File "example.py", line 13, in <module>
    func_a()
  File "example.py", line 4, in func_a
    func_b()
  File "example.py", line 7, in func_b
    func_c()
  File "example.py", line 10, in func_c
    raise ValueError("An error occurred!")
ValueError: An error occurred!

4. 使用 sys 模块获取调用栈

sys 模块也可用于直接访问调用栈的帧对象。

示例:获取调用栈帧

import sys

def func_a():
    func_b()

def func_b():
    func_c()

def func_c():
    print("Current Call Stack:")
    frame = sys._getframe()
    while frame:
        print(f"Function: {frame.f_code.co_name}, Line: {frame.f_lineno}, File: {frame.f_code.co_filename}")
        frame = frame.f_back  # 回溯到上一帧

func_a()
============================================
输出示例:
Current Call Stack:
Function: func_c, Line: 10, File: example.py
Function: func_b, Line: 7, File: example.py
Function: func_a, Line: 4, File: example.py
Function: <module>, Line: 13, File: example.py

注意:
sys._getframe() 是一个内部方法,官方建议仅在调试或工具开发时使用。

5. 使用调试器查看调用栈

调试器工具(如 pdb 或 ipdb)可以暂停程序执行并允许你交互式查看调用栈。

示例:使用 pdb

import pdb

def func_a():
    func_b()

def func_b():
    func_c()

def func_c():
    pdb.set_trace()  # 设置断点

func_a()

=================================================
示例输出:
-> func_c()
(Pdb) where
  /path/to/example.py(13)<module>()
  /path/to/example.py(4)func_a()
  /path/to/example.py(7)func_b()
  /path/to/example.py(10)func_c()

运行程序后,调试器会暂停在 pdb.set_trace() 位置,你可以使用以下命令查看调用栈:

输入 where 或 w:显示调用栈。
输入 up:向上移动一帧。
输入 down:向下移动一帧。

总结

  • traceback 模块:快速打印当前或异常时的调用栈。
  • inspect 模块:获取调用栈的详细信息,适合调试和分析。
  • sys 模块:直接访问帧对象,适合低级调用栈操作。
  • 调试工具(如 pdb):交互式查看调用栈,适合实时调试。

标签:调用,File,python,py,func,debug,example,def
From: https://www.cnblogs.com/michaelcjl/p/18603186

相关文章

  • win10给python起一个别名p
    1、安装python自行安装好python,确保安装成功。2、编写bat脚本在任意目录(我的目录是:C:\ZProgram\p_bat)编写一个脚本,脚本名称为:p.bat,脚本内容如下:@echooffpython%*3、添加环境变量3.1、将python安装的位置添加到环境变量(系统环境变量)Path中3.2、将脚本的位置也加到环......
  • Python3 insloader库爬取博主视频粉丝量,点赞,互动率,国家等信息
    写在题前:之前搞Java的,今天部门的人给了我一批视频链接,问问有没有办法爬出来这一批视频链接的博主的粉丝量,以及该视频的互动率等信息。经过一番探索之后了解了insloader库。真不不得不感叹python的强大。 之前给代码把:importinstaloaderfromurllib.parseimporturlpars......
  • python的venv环境迁移
    前言使用Python内置的venv模块管理python环境,怎么实现环境迁移。方案一 拷贝老环境下的Lib目录1、在新设备上新建与原始环境相同python版本的venv环境python-mvenvmy_venv2、将原始环境.venv下的Lib文件拷贝到新环境中cp-rold/venv/Libnew/my_venv/3、然后就......
  • python中的pip操作
    python中的pip操作1.pip更换国内镜像源由于python自带的源下载速度非常慢,特别是安装一些库的时候,甚至有时会失败。因此,建议将下载源替换成国内的,下载速度会快很多。总共有两种方法代码替换(推荐使用这一种)手动替换1.1代码替换1.1.1阿里源(推荐这个)pipconfigset......
  • Python序列的应用(七):序列、列表
    前言:在Python编程语言中,序列(Sequence)是一种基本且核心的数据结构,它允许我们以有序的方式存储和操作数据。序列可以包含不同类型的元素,并且支持通过索引来访问和修改这些元素。在Python中,最常见的序列类型包括列表(List)、元组(Tuple)、字符串(String)等。这些序列类型在数据处理、......
  • Python playwright 笔记
    1.官网https://playwright.nodejs.cn/docs/api/class-playwright2.PlaywrightforPython:https://playwright.bootcss.com/python/docs/intro3.入门笔记:https://www.byhy.net/4.playwright使用教程python版本-页面监听器、状态检测、执行JS、网络Mock等使用API  https://ww......
  • 【python上位机开发】1、安装开发环境
     从这一章节开始,后续会更新一系列的上位机开发相关的文章,从开始到上位机的开发结束。一是记录自己的学习过程,二是通过文章分享的方式检验自身的学习质量,且从中寻找不足,三是帮助想学习这方面知识的伙伴提供一些拙见和参考。一、开发软件选择 选择python官方的编译器,PyChar......
  • 【接口自动化_进阶】2.0版python接口自动化自建库
    项目介绍目前常见的接口自动化框架,数据维护方式分为两种,一种是维护到文件,另一种维护到代码中。文件方式维护优点:可读性和可维护性好易上手缺点:性能较差些用例设计和使用不灵活冗余数据较多扩展性差代码中维护优点:灵活性高性能高代码及数据复用率高缺点:可读......
  • python语言基础之列表(一)
    目录什么是列表列表的创建与删除通过赋值直接创建列表创建空列表创建数值列表删除列表访问列表元素遍历列表for循环遍历列表for循环与enumerate()函数实现列表更新添加元素修改元素删除元素根据索引删除根据元素值删除什么是列表列表是由一系列按特定顺序......
  • 30个极简Python代码,拿走即用!
    学Python怎样才最快,当然是实战各种小项目,只有自己去想与写,才记得住规则。本文是30个极简任务,初学者可以尝试着自己实现。1重复元素判定以下方法可以检查给定列表是不是存在重复元素,它会使用set()函数来移除所有重复元素。defall_unique(lst):returnlen(lst)==len(......