你有多少次陷入不得不更改别人代码的境地?如果你是一个开发团队的一员,那么你遇到上述境地的次数比你想要的还要多。然而,Python中有一个整洁的调试特性(像其他大多数语言一样),在这种情况下使用非常方便。本文是一篇快速教程,希望它能让你的编码生活更加容易。
1. 一个混乱的程序
出于本教程的目的,让我们研究一下下面的简单程序。
这个程序接收两个命令行参数,然后执行加法和减法操作。
(假设用户输入的是有效值,因此代码中我们没有进行错误处理。)
import sysdef add(num1=0, num2=0): return int(num1) + int(num2)def sub(num1=0, num2=0): return int(num1) - int(num2)def main(): #Assuming our inputs are valid numbers print sys.argv addition = add(sys.argv[1], sys.argv[2]) print addition subtraction = sub(sys.argv[1], sys.argv[2]) print subtractionif __name__ == '__main__': main()
2. PDB
Python提供了一个有用的模块PDB,它实际上是一个交互式源代码调试器。
你需要下面的两行代码来使用此模块。
import pdbpdb.set_trace()
看一下我们修改过的程序,里面包含了一些断点。
import pdbimport sysdef add(num1=0, num2=0): return int(num1) + int(num2)def sub(num1=0, num2=0): return int(num1) - int(num2)def main(): #Assuming our inputs are valid numbers print sys.argv pdb.set_trace() # <-- Break point added here addition = add(sys.argv[1], sys.argv[2]) print addition subtraction = sub(sys.argv[1], sys.argv[2]) print subtractionif __name__ == '__main__': main()
3. 程序执行触发调试器
一旦你设置好断点以后,你就可以像平时一样执行程序。
python debugger.py 1 2
程序将会在遇到的第一个断点处停止执行。
['debugger.py']> /Users/someuser/debugger.py(15)main()-> addition = add(sys.argv[1], sys.argv[2])(Pdb)
我们在第14行设置了一个断点,所以我们能看到将要执行的下一行是第15行。可以看到,在执行到第15行之前程序已经停止。
在这里我们有几个选项,让我们在下面步骤中看看一些调试指令。
4. 下一行->n
在你的调试器提示中,输入n运行到下一行。
> /Users/someuser/debugger.py(14)main()-> addition = add(sys.argv[1], sys.argv[2])(Pdb) n> /Users/someuser/debugger.py(15)main()-> print addition
这会执行当前行代码,并准备执行下一行。
我们可以使用n来逐行执行整个程序,但这其实没有什么用处。
可能你已经看到,PDB实际上并没有进入我们的add函数中。下面,就让我们看看其他几个令调试更加有趣的选项。
新闻热点
疑难解答