Python 调试模块 ipdb

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

内容简介:授人以鱼不如授人以渔,掌握调试方法是学习提升的一个必备条件。前几天因为探索了一下 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 功能,貌似都能理解了!

参考


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

查看所有标签

猜你喜欢:

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

How to Build a Billion Dollar App

How to Build a Billion Dollar App

George Berkowski / Little, Brown Book Group / 2015-4-1 / USD 24.95

Apps have changed the way we communicate, shop, play, interact and travel and their phenomenal popularity has presented possibly the biggest business opportunity in history. In How to Build a Billi......一起来看看 《How to Build a Billion Dollar App》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具