学Python 必备的debug 神器-pdb

2023-10-27

学Python 必备的debug 神器-pdb

目录

  • 叨逼叨
  • 使用介绍
  • 举个简单的栗子

叨逼叨

首先,介绍一下 pdb 调试,pdb 是 python 的一个内置模块,用于命令行来调试 Python 代码。或许你会说,现在用 Pycharm 等编辑器来调试代码很方便,为啥要用命令行呢?这个问题,我曾经也这么想,直到有一次,代码必须要在 Linux 系统上跑(现在 Pycharm 也可以远程调试代码了,今天先不说这个)

使用介绍

如何添加断点?

说到 debug,肯定是要添加断点的,这里有两种方式添加断点:

  • 在想要断点代码后添加 一行
pdb.set_trace()
复制代码

若是使用这种方式,直接运行 Python 文件即可进入断点调试。

  • 用命令行来添加断点
b line_number(代码行数)
复制代码

若是使用这种方式,需要 python -m pdb xxx.py 来启动断点调试。

常用命令

先简单介绍一下使用命令,这里不用记住,等用到的时候回来查就行。

1 进入命令行Debug模式,python -m pdb xxx.py

2 h:(help)帮助

3 w:(where)打印当前执行堆栈

4 d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)

5 u:(up)执行跳转到当前堆栈的上一层

6 b:(break)添加断点

 b 列出当前所有断点,和断点执行到统计次数
 b line_no:当前脚本的line_no行添加断点
 b filename:line_no:脚本filename的line_no行添加断点
 b function:在函数function的第一条可执行语句处添加断点
复制代码

7 tbreak:(temporary break)临时断点

 在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
复制代码

8 cl:(clear)清除断点

 cl 清除所有断点
 cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
 cl lineno 清除当前脚本lineno行的断点
 cl filename:line_no 清除脚本filename的line_no行的断点
复制代码

9 disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用

10 enable:激活断点,参数为bpnumber

11 s:(step)执行下一条命令

 如果本句是函数调用,则s会执行到函数的第一句
复制代码

12 n:(next)执行下一条语句

 如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
复制代码

13 r:(return)执行当前运行函数到结束

14 c:(continue)继续执行,直到遇到下一条断点

15 l:(list)列出源码

 l 列出当前执行语句周围11条代码
 l first 列出first行周围11条代码
 l first second 列出first--second范围的代码,如果second<first,second将被解析为行数
复制代码

16 a:(args)列出当前执行函数的函数

17 p expression:(print)输出expression的值

18 pp expression:好看一点的p expression

19 run:重新启动debug,相当于restart

20 q:(quit)退出debug

21 j lineno:(jump)设置下条执行的语句函数

 只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
复制代码

22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束

23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效

举个简单的栗子

为了验证一下 pdb 的用法,我写了个简单的 Python 代码,如下:

__author__ = 'zone'
__gzh__ = '公号:zone7'
import pdb
class MyScrapy:
 urls = []
 def start_url(self, urls):
 pdb.set_trace()
 for url in urls:
 print(url)
 self.urls.append(url)
 def parse(self):
 pdb.set_trace()
 for url in self.urls:
 result = self.request_something(url)
 def request_something(self, url):
 print('requesting...')
 data = '''<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>
</body>
</html>'''
 return data
scrapy= MyScrapy()
scrapy.start_url(["http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", "http://www.zone7.cn", ])
scrapy.parse()
复制代码

运行实例:(这里为了方便大家阅读,我添加了中文注释,实际运行时不会有注释的)

D:workenvScriptspython.exe D:/work_test/test/pdb_test/pdb_test.py
> d:work_test	estpdb_testpdb_test.py(11)start_url()
-> for url in urls:
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(12)start_url()
-> print(url)
(Pdb) l 注释: l(list)列出当前代码
 7 	 urls = []
 8 	
 9 	 def start_url(self, urls):
 10 	 pdb.set_trace()
 11 	 for url in urls:
 12 ->	 print(url)
 13 	 self.urls.append(url)
 14 	
 15 	 def parse(self):
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
(Pdb) c 注释:c(continue),继续执行,知道遇到下一个断点
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
http://www.zone7.cn
> d:work_test	estpdb_testpdb_test.py(17)parse()
-> for url in self.urls:
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(18)parse()
-> result = self.request_something(url)
(Pdb) l 注释: l(list)列出当前代码
 13 	 self.urls.append(url)
 14 	
 15 	 def parse(self):
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
 18 ->	 result = self.request_something(url)
 19 	
 20 	 def request_something(self, url):
 21 	 print('requesting...')
 22 	 data = '''<!DOCTYPE html>
 23 	<html lang="en">
(Pdb) s 注释: s(step)这里是进入 request_something() 函数的意思
--Call--
> d:work_test	estpdb_testpdb_test.py(20)request_something()
-> def request_something(self, url):
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(21)request_something()
-> print('requesting...')
(Pdb) l 注释: l(list)列出当前代码
 16 	 pdb.set_trace()
 17 	 for url in self.urls:
 18 	 result = self.request_something(url)
 19 	
 20 	 def request_something(self, url):
 21 ->	 print('requesting...')
 22 	 data = '''<!DOCTYPE html>
 23 	<html lang="en">
 24 	<head>
 25 	 <meta charset="UTF-8">
 26 	 <title>Title</title>
(Pdb) p url 注释:p(print)打印出 url 变量的数据
'http://www.zone7.cn'
(Pdb) n 注释:n(next)执行下一步
requesting...
> d:work_test	estpdb_testpdb_test.py(31)request_something()
-> </html>'''
(Pdb) p data 注释:p(print)打印出指定变量的数据,这里由于赋值还没完成,所以报错
*** NameError: name 'data' is not defined
(Pdb) n 注释:n(next)执行下一步
> d:work_test	estpdb_testpdb_test.py(32)request_something()
-> return data
(Pdb) p data 注释:p(print)打印出指定变量的数据
'<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

</body>
</html>'
(Pdb) q 注释:q(quit)退出
复制代码

总结按照上面的例子一套下来,基本的用法就可以学会了,关键还是得自己多实践,动手操练!


转载于:https://juejin.im/post/5d00b64fe51d45598611b94c

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学Python 必备的debug 神器-pdb 的相关文章

  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 酸洗过程是确定性的吗?

    对于特定的输入值 Pickle 是否总是产生相同的输出 我想当腌制具有相同内容但不同插入 删除历史记录的字典时可能会出现问题 我的目标是使用 Pickle 和 SHA1 创建函数参数的 签名 以实现 memoize 我想当腌制具有相同内容但
  • 在 NetworkX 中使边缘更粗

    student id 0 1 2 3 4 5 6 7 8 9 10 11 12 0 131X1319 1 14 6 16 1 10 8 15 15 17 15 18 16 1 13212YX3 1 1 4 8 11 9 14 7 0 3 0
  • 如何在 R 或 Python 中制作旭日图?

    到目前为止 我一直无法找到一个可以创建旭日图的 R 库约翰 斯塔斯科 http www cc gatech edu gvu ii sunburst 有人知道如何在 R 或 Python 中实现这一点吗 在极坐标投影中使用 matplotli
  • Python:删除字符串开头的数字

    我有一些这样的字符串 string1 123 123 This is a string some other numbers string2 1 This is a string some numbers string3 12 3 12 T
  • RTSP 设置后接收 RTP 数据包

    我正在尝试使用 Python 从 IP 摄像机流式传输 RTP 数据包 我能够使用 RTSP 协议发送描述 设置和播放命令 但是 我无法开始使用 RTP 传输实际视频流 这是代码 import socket def printrec rec
  • 在 MAC OS X 10.9 上安装 NLTK 确实很困难

    我是 Python Mac OS 新手 我正在寻找 NLTK 教科书 但我在安装它时遇到了一些问题 我一直在寻找解决方案 但不幸的是 所有解决方案似乎都不适合我 或者我误解了如何使用它们 我遇到的基本问题是 尽管按照说明进行操作 NLTK
  • Python极坐标图:绘制与角度对应的值

    我正在尝试绘制以不同角度记录的传感器数据 import pandas as pd import matplotlib pyplot as plt create dataframe each row contains an angle and
  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 没有名为 crypto.cipher 的模块

    我现在正在尝试加密一段时间 我最近得到了这个基于 python 的密码器 名为PythonCrypter https github com jbertman PythonCrypter 我对 Python 相当陌生 当我尝试通过终端打开 C
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一

随机推荐

  • 「AI初识境」深度学习中常用的损失函数有哪些?

    https www toutiao com a6695152940425937411 这是专栏 AI初识境 的第11篇文章 所谓初识 就是对相关技术有基本了解 掌握了基本的使用方法 今天来说说深度学习中常见的损失函数 loss 覆盖分类 回
  • 代码审查清单

    代码审查清单 常规项 代码能够工作么 它有没有实现预期的功能 逻辑是否正确等 所有的代码是否简单易懂 代码符合你所遵循的编程规范么 这通常包括大括号的位置 变量名和函数名 行的长度 缩进 格式和注释 是否存在多余的或是重复的代码 代码是否尽
  • 在开发中,我们需要对后端返回来的数据进行转型,后端返回的字符串类型,布尔类型,进行使用

    后端返回 num 12 598 num2 11 222 这种字符串的数字 在前端需要根据这个数字来做一些判断的时候 直接 if num gt num2 console log 方法 这样子操作 很明显是不可以的 所以我们需要进行转换数据类型
  • wsl ubuntu拒绝访问_用WSL轻松实现WinLinux双系统

    在很多的情况下 我们对Linux具有不可替代的需求 但Ps Pr等工具的适用场景也使得我们不能抛弃Windows 面对此种情状 大部分人要么会选择使用虚拟机 要么则会选择双系统 但事实上 过于臃肿的虚拟机系统会使得硬件资源的占用率非常高 进
  • personal Richard photo picture

  • 更新Android studio后 sdk没有tools目录,无法使用device monitor

    谷歌在较新版本的android studio内去除了DDMS的支持 用其他功能代替 而日常开发测试中 Device Monitor的应用还是非常方便的 那么 问题来了 如何继续使用DDMS这款调试神器 如何在谷歌已经弃用的情况下 重新安装a
  • ES6入门八:Promise异步编程与模拟实现源码

    Promise的基本使用入门 实例化promise对象与注册回调 宏任务与微任务的执行顺序 then方法的链式调用与抛出错误 throw new Error 链式调用的返回值与传值 Promise的基本使用进阶 then catch fin
  • 查询oracle数据库里的表空间利用率

    select a tablespace name round a total size total size MB round a total size round b free size 3 used size MB round b fr
  • @RequestBody与@ResponseBody的区别以及@PathVariable的用法

    一 RequestBody RequestBody的作用是将前端传来的json格式的数据转为自己定义好的javabean对象 前端向后端传递数据 图中以json数据为例 需要注意的是传入数据的属性名称要和后端javabean中定义的一致 注
  • 多层网络的反向传播算法

    目录 一 可微阈值单元 二 多层网络的反向传播算法 1 反向传播算法推导 2 两层sigmoid单元网络训练算法的表示 3 任意深度层次有向无环网络训练算法的表示 三 小结 在 感知器的数学表达和训练算法一节中 重点学习了ANN系统中单个单
  • 腾讯云Ubuntu部署Django(Django + uwsgi +nginx + MySQL)

    目录 前言 一 环境版本信息 二 准备Ubuntu的python3环境 python3 8 3 1 安装编译环境 2 下载Python源码 3 解压 4 配置安装选项 5 编译 安装 6 设置软连接 三 Ubuntu下安装virtualen
  • Java接入Spark之创建RDD的两种方式和操作RDD

    首先看看思维导图 我的spark是1 6 1版本 jdk是1 7版本 spark是什么 Spark是基于内存计算的大数据并行计算框架 Spark基于内存计算 提高了在大数据环境下数据处理的实时性 同时保证了高容错性和高可伸缩性 允许用户将S
  • android 图表实现,Android实现图表绘制和展示

    本文演示在Android平台中绘制和展示图表示例 本示例是基于RChart 2实现的 在一个系统中经常要用到图表统计数据 在WEB开发中图表绘制是一件简单的事情 因为有比较多的开源方案 但在Android中开源方案并不多 Android中绘
  • C#中的 属性 字段 成员变量

    1 首先属性和字段都是成员变量 2 其次属性和字段都是用来存储数据的 3 属性和字段的区别 class test private int a 1 public int A get return a set a value 字段 privat
  • OrCAD PSPICE 仿真 问题集

    1 创建SIM 文件时出现 cannot initialize profile A 所有路径也都是英文路径 B 检查下安装目录下的SPB 16 6 tools pspice目录下的orsimsetup dll是不是还在 也可以找个新的文件替
  • 左神算法与数据结构全阶课上笔记(1)——排序算法(C++实现)

    算法与数据结构新手班 class01 尾田改写C 版 B站视频地址 https bilibili com video BV1g3411i7of p 8 spm id from pageDriver class01代码github地址 htt
  • org.apache.catalina.core.StandardWrapperValve invoke的解决办法

    故障码 Servlet service for servlet servletAction threw exception java lang NullPointerException at com dbdao mysql mySqlCon
  • Java 面向对象之继承

    目录 1 类和包 2 static 关键字 3 继承 3 1 继承的特点 3 2 继承中成员变量的访问特点 3 3 继承中成员方法的访问特点 3 4 方法重写 3 5 继承中构造方法的访问特点 4 抽象类 5 模板设计模式 6 final
  • React—条件渲染不同的组件

    import React from react import ReactDom from react dom class UserGreeting extends React Component render return h1 欢迎回来
  • 学Python 必备的debug 神器-pdb

    学Python 必备的debug 神器 pdb 目录 叨逼叨 使用介绍 举个简单的栗子 叨逼叨 首先 介绍一下 pdb 调试 pdb 是 python 的一个内置模块 用于命令行来调试 Python 代码 或许你会说 现在用 Pycharm