千家信息网

Python代码调试的方法是什么

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,这篇文章主要介绍"Python代码调试的方法是什么",在日常操作中,相信很多人在Python代码调试的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Pytho
千家信息网最后更新 2024年11月25日Python代码调试的方法是什么

这篇文章主要介绍"Python代码调试的方法是什么",在日常操作中,相信很多人在Python代码调试的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python代码调试的方法是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

清单 1. 测试代码示例

import pdba = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = a + b + cprint final

开始调试:直接运行 脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。

清单 2. 利用 pdb 调试

[root@rcc-pok-idg-2255 ~]# python epdb1.py> /root/epdb1.py(4)?()-> b = "bbb"(Pdb) n> /root/epdb1.py(5)?()-> c = "ccc"(Pdb)> /root/epdb1.py(6)?()-> final = a + b + c(Pdb) list1 import pdb2 a = "aaa"3 pdb.set_trace()4 b = "bbb"5 c = "ccc"6 -> final = a + b + c7 print final[EOF](Pdb)[EOF](Pdb) n> /root/epdb1.py(7)?()-> print final(Pdb)

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

清单 3. 退出 debug

[root@rcc-pok-idg-2255 ~]# python epdb1.py> /root/epdb1.py(4)?()-> b = "bbb"(Pdb) n> /root/epdb1.py(5)?()-> c = "ccc"(Pdb) qTraceback (most recent call last):File "epdb1.py", line 5, in ?c = "ccc"File "epdb1.py", line 5, in ?c = "ccc"File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatchreturn self.dispatch_line(frame)File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_lineif self.quitting: raise BdbQuitbdb.BdbQuit

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … ....> 错误。

清单 4. debug 过程中打印变量

[root@rcc-pok-idg-2255 ~]# python epdb1.py> /root/epdb1.py(4)?()-> b = "bbb"(Pdb) n> /root/epdb1.py(5)?()-> c = "ccc"(Pdb) p b'bbb'(Pdb)'bbb'(Pdb) n> /root/epdb1.py(6)?()-> final = a + b + c(Pdb) p c'ccc'(Pdb) p final*** NameError:(Pdb) n> /root/epdb1.py(7)?()-> print final(Pdb) p final'aaabbbccc'(Pdb)

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

清单 5. 停止 debug 继续执行程序

[root@rcc-pok-idg-2255 ~]# python epdb1.py> /root/epdb1.py(4)?()-> b = "bbb"(Pdb) n> /root/epdb1.py(5)?()-> c = "ccc"(Pdb) caaabbbccc

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

清单 6. debug 过程中显示代码

[root@rcc-pok-idg-2255 ~]# python epdb1.py> /root/epdb1.py(4)?()-> b = "bbb"(Pdb) list1 import pdb2 a = "aaa"3 pdb.set_trace()4 -> b = "bbb"5 c = "ccc"6 final = a + b + c7 pdb.set_trace()8 print final[EOF](Pdb) c> /root/epdb1.py(8)?()-> print final(Pdb) list3 pdb.set_trace()4 b = "bbb"5 c = "ccc"6 final = a + b + c7 pdb.set_trace()8 -> print final[EOF](Pdb)

在使用函数的情况下进行 debug

清单 7. 使用函数的例子

import pdbdef combine(s1,s2): # define subroutine combine, which...s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...s3 = '"' + s3 +'"' # encloses it in double quotes,...return s3 # and returns it.a = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = combine(a,b)print final

如果直接使用 n 进行 debug 则到 final=combine(a,b) 这句的时候会将其当做普通的赋值语句处理,进入到 print final。如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

清单 8. 对函数进行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py> /root/epdb2.py(10)?()-> b = "bbb"(Pdb) n> /root/epdb2.py(11)?()-> c = "ccc"(Pdb) n> /root/epdb2.py(12)?()-> final = combine(a,b)(Pdb) s--Call--> /root/epdb2.py(3)combine()-> def combine(s1,s2): # define subroutine combine, which...(Pdb) n> /root/epdb2.py(4)combine()-> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...(Pdb) list1 import pdb23 def combine(s1,s2): # define subroutine combine, which...4 -> s3 = s1 + s2 + s1 # sandwiches s2 between copies of s1, ...5 s3 = '"' + s3 +'"' # encloses it in double quotes,...6 return s3 # and returns it.78 a = "aaa"9 pdb.set_trace()10 b = "bbb"11 c = "ccc"(Pdb) n> /root/epdb2.py(5)combine()-> s3 = '"' + s3 +'"' # encloses it in double quotes,...(Pdb) n> /root/epdb2.py(6)combine()-> return s3 # and returns it.(Pdb) n--Return--> /root/epdb2.py(6)combine()->'"aaabbbaaa"'-> return s3 # and returns it.(Pdb) n> /root/epdb2.py(13)?()-> print final(Pdb)

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。

清单 9. 在调试的时候动态改变值

[root@rcc-pok-idg-2255 ~]# python epdb2.py> /root/epdb2.py(10)?()-> b = "bbb"(Pdb) var = "1234"(Pdb) b = "avfe"*** The specified object '= "avfe"' is not a functionor was not found along sys.path.(Pdb) !b="afdfd"(Pdb)

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。

到此,关于"Python代码调试的方法是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

代码 清单 函数 方法 变量 时候 程序 学习 动态 过程 命令 更多 语句 错误 面的 项目 帮助 明显 粗鲁 较大 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 ff14服务器 计算机网络安全现状与防御技术 悬镜服务器安全卫士好用吗 mysql数据库第二次打开 现代网络安全现状 手机网络安全钥匙在哪里 重视网络安全的必要性 华为tecal服务器 黑客进攻服务器不留痕迹吗 达梦数据库系统处于状态切换中 惠普网络安全钥匙密码多少 软件开发项目合同 伴儿互联网科技 企业为什么不重视网络安全 局域网中服务器是网络控制的核心 数据库同步工具cattle dm数据库怎么查看慢sql 测试人员数据库笔试题及答案 周村网络审批oa软件开发 湖北蓝狐网络技术有限责任公司 广州领闲互联网科技有限公司 数据库的选择有哪些原则 电脑做服务器可以同时访问几个人 软件开发培训学校百世快递 网络安全法释义书籍 有索引的数据库表查询 数据库sql的record难吗 ibm服务器管理口叫什么 计算机网络技术能修电脑吗 下载游戏服务器解压错误
0