Pulpcode

捕获,搅碎,拼接,吞咽

0%

使用pdb而不是print调试python

名词解释:

野路子:口语,指的是非科班出身的,非正规的。

暴力的调试:

很多人一开始跟我一样,喜欢用这样的方式调试程序:

1
2
3
4
print "*****************"
print somevalue
print type(somevalue)
print "*****************"

别小看这几行代码,两边的*号,方便自己一眼就能看到想打印的值,之后的代码不但打印了值,还打印了类型,对于调试python这样的动态语言再好不过了。

之后我们使用二分查找的方法,逐步逼近问题。。。还自我感觉很聪明。

pdb

我不知道为啥很多直接学python的人,这么不喜欢用调试器,还盲目的喜欢黑微软,拜托,你去用一下c#和vs,就会明白你的vim,emacs和shell有多渣。

后来我明白了,他们并不知道有这么好用的东西。

命令   解释
----------------
break 或 b    设置断点 设置断点
continue 或 c 继续执行程序
list 或 l     查看当前行的代码段
step 或 s     进入函数
return 或 r   执行代码直到从当前函数返回
exit 或 q     中止并退出
next 或 n     执行下一行
pp 或 p       打印变量的值
help         帮助

pgb 可以让你在某处打断点,然后一行行的执行代码,查看变量,看看到底是哪里出了问题。

1
2
3
4
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
1
2
3
4
5
6
7
8
localhost% python test.py
> /Users/liuaiqi/github/laboratory/pdb/test.py(9)<module>()
-> b = "bbb"
(Pdb) p b
*** NameError: NameError("name 'b' is not defined",)
(Pdb) p a
'aaa'
(Pdb)

可惜,pdb过于简陋,连个高亮都没有。所以我建议你使用ipdb算了。(需要安装ipython和ipdb)

1
2
3
4
import ipdb
a = "aaa"
ipdb.set_trace()
b = "bbb"

pdb相当于在python解释器中操作,而ipdb相当于在ipython解释器中操作,ipython的强大就不用多说了。

pycharm

这个不用多说了,IDE在左边打一个红点,就是一个断点。然后就看窗口中的变量值就行了。

pycharm-debug

最后的福利:

想不想你的python代码出现了,直接能够跳到ipython中,你方便的查看是哪里出现了问题?

将下面代码做成一个crash_on_ipy.py文件,然后import进来就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

class ExceptionHook:
instance = None

def __call__(self, *args, **kwargs):
if self.instance is None:
from IPython.core import ultratb
self.instance = ultratb.FormattedTB(mode='Plain',
color_scheme='Linux', call_pdb=1)
return self.instance(*args, **kwargs)

sys.excepthook = ExceptionHook()