相信很多朋友都和我一样,在初期调试python程序的时候喜欢用print大法,觉得哪个地方比较可疑,就在前中后加一堆print。但如果使用IDE,就可以更高效地完成这一任务,今天我们就以pycharm为例一起来看看简单而高效的断点调试到底该如何操作。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
什么是debug?
在实际操作之前有必要先来点理论知识铺垫一下,这样后面说到那么多按键的功能理解起来就水到渠成了。
调试程序,也叫做debug,就是对于结果不符合预期的程序,将程序执行的过程放慢甚至中途暂停,通过逐步排查中间变量或者输出以定位有故障的代码段的过程。
正常的程序从点击“运行”到返回结果也就一眨眼的功夫,假设在这一眨眼的功夫程序从前到后一共执行了A,B,C三块代码,我们就可以让程序执行完A暂停一下,看看结果是否符合预期,如果符合预期再执行B,执行完B又暂停一下,看看结果是否符合预期。假设B这一段代码结果不符合预期,那我们就可以对B进行逐行逐行更细致地执行和观察,看看到底在哪一步有问题。一直到B也符合要求了,我们再对C依法炮制。最后完成整个代码的调试目的。
通过上面的操作逻辑可以看出,一个debug过程需要用到以下几个工具。
断点
断点(Breakpoint),顾名思义程序运行到这就中断暂停了,等待着用户的指示。一个程序可以设置多个断点。
单步执行
单步执行(Step over),是debug过程中的一个按键,用户每按该按键一次,程序往下运行一行,可以说debug的过程基本就是个不停单步执行的过程。
那假如我很确信接下来10行代码肯定没有问题,能不能中途快速跳过这10行?当然没问题,在第11行设置一个断点,让程序正常运行到断点自动暂停即可。
所以学会设置断点以及单步执行,调试的任务就会了大半。
函数
函数的处理要单独拿出来说一下。当主程序调用了一个自定义函数的时候,分为两种情况:
- 假如很确定这个函数的代码正确无误,直接按一下单步执行,把这个函数调用当作一步来处理。等这个函数执行完毕,继续在主程序下一行代码等待用户操作
- 假如还想进入这个函数内部看看执行细节,就需要执行进入函数(Step into)操作。Debug程序就会停留在函数的第一行等待用户操作。函数内单步运行到一半,又觉得函数没什么问题,也可以利用跳出函数(Step out)操作将函数运行完毕,继续在主程序下一行代码等待用户操作
Debug的常规操作,就是在特定地点设置好断点,进入debug模式开始跑程序,断点开始单步执行。遇到函数可以选择进去或者不进。想跳过某一段代码就设置另一个断点,让程序正常运行过去。如此反复。
pycharm的debug界面
下面打开pycharm实际看一下debug的操作界面是啥样子的。
进入debug模式
如图所示,在正常的代码编辑页面,界面上方在代表运行的绿色三角形右边,有一个甲壳虫一样的图标,点击一下就会对当前的这个文件进行debug
当然进入debug的方法不止这一种,在代码编辑区域点击右键,也会看到debug的选项
最后一种方法,如果有if __name__ == '__main__'
语句出现,会自动在其左边出现一个绿色小箭头。点击小箭头可以选择debug
debug界面
我的主程序如下所示
if __name__ == '__main__':
a = input('Please input an integer:')
result = classify(int(a))
print(result)
我在执行自定义函数的result = classify(int(a))
这一行左面的行号码旁边点一下设置一个断点。断点用一个粉红色的红点表示。
然后按一下上面的甲壳虫按钮进入debug模式,假如代码运行到断点处,设置了断点的这一行会变蓝,表示等待执行。
此时界面下方弹出了console,是程序提示我输入一个数字,也就是说运行到了a = input('Please input an integer:')
这一行了
我输入一个数字,回车,注意这时候的变化:
- 断点行变蓝,表示程序运行到了断点处(断点行还未执行)
- 界面下方自动进入debugger,可以看到一堆竖着的和横着的按钮,以及一个大的区域显示着变量的名字,数据类型和值,例如我刚才输入的数字5,这里是string类型
按钮介绍
先来看看竖着的一排按钮
- rerun
快捷键Ctrl + F5,重新用debug模式跑程序 - resume program
快捷键F9,继续运行程序到下一个断点处,没有断点就直接将程序运行到结尾 - pause program
暂停程序,基本不会使用 - stop program
快捷键Ctrl + F2,停止程序,用于中途退出debug模式,返回代码编辑模式 - view breakpoints
查看所有的断点,可以选择其中某些去激活 - mute breakpoints
直接对所有断点去激活
还有左下角有个螺丝一样的按钮,可以对debugger界面的显示做一些设置,例如是否在程序中显示该行变量的值等等。
再来看看横着的一排按钮
- console
回到console窗口,例如需要和程序交互或者是查看程序的打印 - show execution point
快捷键Alt + F10,代码窗口跳转到待执行的那一行,也就是标蓝色的那一行 - step over
快捷键F8,前面提到的单步执行 - step into
快捷键F7,前面提到的进入函数 - step into my code
快捷键Alt + Shift + F7,也是前面提到的进入函数,不过只进入自定义的函数 - step out
快捷键Shift + F8,前面提到的执行完函数并跳出函数 - run to cursor
快捷键Alt + F9,程序运行到光标处,不用设置断点了 - evaluation expression
计算表达式,可以利用函数的中间变量去做一些计算
实例演示
知道了各个按钮的作用,我们一起来用一个实例演示一下。
代码文件内容如下
#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Demo pycharm debug usage
T型人小付@CSDN
'''
def incr_by_one(num):
print('Increase by one.')
return num+1
def incr_by_two(num):
print('Increase by two.')
return num+2
def classify(num):
print('if num is odd, increase by one; if num is even, increase by two.')
if num % 2 == 0:
result = incr_by_two(num)
else:
result = incr_by_one(num)
return result
if __name__ == '__main__':
a = input('Please input an integer:')
result = classify(int(a))
print(result)
定义了三个函数,主程序中会进入classify
做一个判断,如果输入的整数是奇数,执行incr_by_one
函数,如果是偶数执行incr_by_two
函数。
刚才程序已经运行到了断点处暂停,我按下step into
按钮进入classify
函数内进行单步执行,可见蓝色已经到了classify
函数的第一行,如下
在下面的变量显示窗口可以看到num
的值为5,我再连按两次step over
,蓝色跳过if下的内容直接跳到了else语句处,如下
我不想进入incr_by_one
函数,所以直接按step over
让它直接执行完毕,蓝色跳转到了return语句,下面显示变量result
的值为6,如下
执行完毕,我们跳转到console
窗口,可以看到函数打印的内容符合刚才的执行顺序,如下
这样一次简单的debug调试过程就结束了
总结
pycharm是一个非常强大的工具,我这里抛砖引玉,大家如果还有自己觉得好用的pycharm调试小技巧也欢迎在下面分享给我哈,谢谢。