千家信息网

Python必备的debug神器pdb怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家介绍Python必备的debug神器pdb怎么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。学Python 必备的debug 神器-pdb首先,介绍一下 pdb
千家信息网最后更新 2026年11月03日Python必备的debug神器pdb怎么用

这篇文章给大家介绍Python必备的debug神器pdb怎么用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

学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

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 pdbclass 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 = '''  Title''' return datascrapy= 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.cnhttp://www.zone7.cnhttp://www.zone7.cnhttp://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 = ''' 23  (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 = ''' 23   24   25    26   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()-> '''(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)打印出指定变量的数据'      Title    '(Pdb) q 注释:q(quit)退出

关于Python必备的debug神器pdb怎么用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

断点 注释 代码 函数 命令 堆栈 语句 脚本 神器 参数 变量 数据 方式 帮助 运行 一行 内容 时候 更多 若是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网络科技 新华互联网科技学校 未来的互联网科技 互联网金融科技平台 科技互联网创业计划书 四川狮子座互联网科技 现代科技和互联网有关系吗 重庆互联网医院沙龙医盟信息科技 崇明区互联网教育科技诚信经营 互联网科技的全部知识 四川慕妮娅互联网科技有限公司 中和天地互联网科技有限公司 中科明德北京互联网科技 无锡工业互联网科技有限公司 科技互联网海报 宁波跨境商互联网科技有限公司 广州智享互联网科技 米泉互联网科技专业怎么样 互联网科技博主张洲 安徽九吞吴互联网科技有限公司 南京欣网互联网络科技有限公司 卓越科技(互联网 ) 滨湖区互联网智能科技产品供应 互联网之后的科技是什么 互联网金融中的现代科技 洛阳共同富裕互联网科技有限公司 四川慕妮娅互联网科技有限公司 济南小医互联网科技有限公司招聘 青岛易易互联网科技 高科技和互联网的现代国家
0