我用的是Python 2.7.8.
1. 设置断点, 查看对象的属性和值
在任意想设断点的语句前面加上这两行:
import pdbpdb.set_trace()
如果没有被Exception打断的话,程序执行到这里会停下,这时候可以用‘n’或‘next’执行下一行语句,用‘s’或‘step’进入一个函数内部,用‘w‘或’where‘看一下调用栈也就是我在哪里,用’l’或‘list’查看断点处的10行语句,用‘变量名’或‘print 变量名’ 查看一个对象。Python里一切都是对象,一个对象(object)有很多属性,用‘dir(变量名)’查看一个对象的所有属性,用’vars(变量名)’或’变量名.__dict__’查看一个对象的所有属性和值,如果想让格式漂亮点:
for k,v in objectName.__dict__.iteritems(): print k, ': ', v
犀利之处在于可以指定条件来设断点:
if condition1 and condition2: import pdb pdb.set_trace()
__file__属性很有用,可以去对象的源文件看看代码。类型是instancemethod的对象没有__file__属性,可以用__func__.func_code来看看该方法的源码在哪里。
2. 查看traceback, 也就是哪里出错了
一般Python遇到exception会给出详细的traceback信息,即函数A第m行调用函数B,函数B第n行调用函数C,函数C第k行有exception没处理,就在这里出错了。但有时候改别人的Python程序,可能Exception都被笼统地处理为一个错误信息然后输出,没给出traceback,这时候在可疑代码周围加几行就能显示traceback了:
import tracebacktry: 我认为最可能出错的那段代码except: print traceback.format_exc()
?
以上技巧就足以对付我日常遇到的Python bug了,欢迎留言:-)
原文地址:Python调试技巧, 感谢原作者分享。 从哪里跌倒就会从哪里爬起来,让我们一起努力吧