Python 调试模块 ipdb

栏目: Python · 发布时间: 5年前

内容简介:授人以鱼不如授人以渔,掌握调试方法是学习提升的一个必备条件。前几天因为探索了一下 Python 模块引入路径的问题,看到「翔 Core」用 pdb 调试的很溜,因此,今天研究一下 ipdb好啦。ipdb 是 pdb 模块的升级版,会启动一个 ipython 的调试窗口。

Python 调试模块 ipdb

授人以鱼不如授人以渔,掌握调试方法是学习提升的一个必备条件。前几天因为探索了一下 Python 模块引入路径的问题,看到「翔 Core」用 pdb 调试的很溜,因此,今天研究一下 ipdb好啦。

安装

ipdb 是 pdb 模块的升级版,会启动一个 ipython 的调试窗口。

pip install ipdb

使用

python -m ipdb demo.py
import ipdb;ipdb.set_trace()

帮助文档

在 ipdb 窗口,输入 h ,会看到帮助文档, h <command> 可以查看具体命令的帮助。

Documented commands (type help <topic>):
========================================
EOF    cl         disable  interact  next    psource  rv         unt
a      clear      display  j         p       q        s          until
alias  commands   down     jump      pdef    quit     source     up
args   condition  enable   l         pdoc    r        step       w
b      cont       exit     list      pfile   restart  tbreak     whatis
break  continue   h        ll        pinfo   return   u          where
bt     d          help     longlist  pinfo2  retval   unalias
c      debug      ignore   n         pp      run      undisplay

Miscellaneous help topics:
==========================
exec  pdb

常用命令

  • a(rgs) :打印当前函数的参数列表 ★★★
  • b(reak) [ ([filename:]lineno | function) [, condition] ] :设置断点,可以接行数或者行数名作为参数,比如, b 8 就是在第8行打断点,还可以给外部的文件加上断点 b file_name:line_number ,如果只敲 b ,会显示全部断点
  • c(ont(inue)) :继续执行,当遇到断点时才会停止 ★★★
  • cl(ear) filename:lineno :可以清除断点,不过不加「断点号」,可以清除所有断点
  • disable bpnumber [bpnumber ...] :禁用指定[断点号]的断点
  • enable bpnumber [bpnumber ...] :启用指定[断点号]的断点
  • Enter :重复上次命令 ★★★
  • j(ump) :设置下一步执行的行,这个语句可以让你跳过某些语句的执行,并不是网上一些文章说的 跳到某行 ,跳到某行可不是代表会跳过某些语句的,文档最准确
  • ll or l :查看当前将要运行的代码段
  • n(ext) :让程序运行下一行,如果当前语句有一个函数调用,用 n 是不会进入被调用的函数体中的 ★★★
  • pp expression or p expression :前者以 pprint 方式打印表达式的值,后者 print 方式 ★★★
  • q(uit) :退出调试,同时,你也可以使用 Ctrl+D 退出调试
  • r(eturn) :继续执行,直到当前函数返回 ★★★
  • restart "restart" is an alias for "run". :是 run 命令的别名,重新启动调试器;
  • run [args...] :这里的参数会作为运行脚本的参数,等价于 python demo.py [args...] ,可以通过 sys.argv 查看参数列表,重新运行时,断点等信息会保留的
  • s(tep) :和 n 相似,但是如果当前有一个函数调用,s 会进入被调用的函数体中 ★★★
  • w(here) :打印一个堆栈跟踪,
  • ! :感叹号后面跟着语句,可以直接改变某个变量的值

示例

断点示例

下面是一个关于断点的示例:

执行 b 7b 12 之后,输入 ll 查看,最左侧的 1、2 就是断点号,输入 c ,下次运行到断点处,执行就会停下来。

ipdb> ll
----> 1 a = 'michael'
      2 print(a)
      3
      4 def hello(name):
      5     print('hello')
      6     for i in range(5):
1     7         print(i)
      8     print(name)
      9
     10
     11 hello('michael')
2    12 x = 10
     13 y = 20

执行 disable 1 ,下次执行到「断点1」处,就不会停下来了,输入 b 可以查看全部断点:

ipdb> b
Num Type         Disp Enb   Where
1   breakpoint   keep no    at /Users/michael/Code/00-Temp/b.py:7
2   breakpoint   keep yes   at /Users/michael/Code/00-Temp/b.py:12

如果想清除「断点2」,那么执行 cl 2 即可:

ipdb> cl 2
Deleted breakpoint 2 at /Users/michael/Code/00-Temp/b.py:12

run 示例

ipdb> run --name michael
Restarting b.py with arguments:
	--name michael
> /Users/michael/Code/00-Temp/b.py(1)<module>()
----> 1 a = 'michael'
      2 print(a)
      3

ipdb> import sys
ipdb> sys.argv
['b.py', '--name', 'michael']

看到上面的结果,确实等价于 python b.py --name michael

注意点

ipdb 调试窗口,虽然可以随时给变量赋值,但是要注意变量的名字和 ipdb 的命令不能重复了,否则会出错,可以用 !b=123 来规避这个问题。

最后

学完这个 ipdb 的调试,再回头看看 Pycharm 的 debug 功能,貌似都能理解了!

参考


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux从入门到精通

Linux从入门到精通

刘忆智、等 / 清华大学出版社 / 2010-1-1 / 59.00元

linux是目前增长最迅速的操作系统。本书由浅入深、循序渐进地向读者介绍linux的基本使用和系统管理。全书内容包括linux概述、linux安装、linux基本配置、桌面环境基本操作、shell基本命令、文件和目录管理、软件包管理、磁盘管理、用户与用户组管理、进程管理、网络配置、浏览网页、收发邮件、文件传输和共享、远程登录、多媒体应用、图像浏览和处理、打印机配置、办公软件的使用、linux编程工......一起来看看 《Linux从入门到精通》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具