![Python从菜鸟到高手(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/534/47216534/b_47216534.jpg)
1.5 调试Python程序
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P26_1779.jpg?sign=1739668258-fdrcoKRacmKLFNGCzi5LAbLwH2WPPjlH-0-ce58ef6ccb6825fb499fe7c782474e12)
微课视频
在开发复杂的Python程序时,如果出现bug,就需要对程序进行调试,以便找出bug对应的代码行。调试程序的方法很多,例如,可以使用print函数在程序的不同位置输出特定的信息,以便缩小bug出现的范围。不过这种方法太原始了,现在普遍使用的方法是通过调试器一步步跟踪代码行,这种方式可以非常方便地找到bug所在的位置。
在PyCharm中调试Python代码的步骤如下。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P26_1769.jpg?sign=1739668258-OLK8NhbBHOZbncSbZ0N8o45aSK6Z6Oz8-0-6de3417f9bcf5626dbb03366447c7ae1)
图1-15 设置断点后的效果
1.设置断点
设置断点是调试程序的过程中必不可少的一步。Python调试器每次遇到断点时会将当前线程挂起,也就是暂停当前程序的运行。
在PyCharm编辑器中行号的后面单击,就可以为当前行添加断点,如果当前行已经有断点,再单击一次,就会删除当前行的断点。设置断点后的效果如图1-15所示。
2.以调试方式运行Python程序
在PyCharm中运行分为两种方式:Release和Debug,也就是发行和调试。如果只想观察程序的执行效果,可以选择Release方式;如果要调试程序,就需要使用Debug方式。
Debug按钮在PyCharm工具栏左侧,如图1-16所示(显示小爬虫的按钮,在Release按钮的右侧)。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P26_1772.jpg?sign=1739668258-2l0zoGmXRk99C7fU8wvkwNM3kGFziFMA-0-621ef9b8041ff23e62af5700fa1835ac)
图1-16 Debug按钮
现在单击Debug按钮,就会运行Python程序,如果Python程序没有设置任何断点,Debug和Release方式运行的效果是一样的,都会输出运行结果,只不过以Debug方式运行程序,除了会输出运行结果,还会连接到调试服务器,并输出如图1-17所示的连接成功信息。
如果Python程序中有断点,当程序执行到断点处,就会暂停程序,并且将断点行设为蓝色背景,如图1-18所示。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P27_1791.jpg?sign=1739668258-PsCyAeZ3nkOZjoIvZtCFdQvbVrurvo6Q-0-f43977ff08a4515e906ac881d7f64d82)
图1-17 输出连接成功信息
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P27_1792.jpg?sign=1739668258-cnclgQhnPIJH5WvWEh5mBw0Rp57wlg1K-0-09ee40c33536ff6912d3c6714f9ea97d)
图1-18 将断点行设为蓝色背景
同时,在PyCharm下方会显示Debugger视图,如图1-19所示。在该视图中会显示各种调试信息。
3.跟踪调试程序
调试的主要目的是将程序中的数据展现出来,也就是说,调试调的就是程序中的数据。因此,通过Python调试器,可以用多种方式观察Python程序中数据的变化。例如,由于n = 20在m = 30前面,所以在m = 30处中断后,n = 20肯定是已经执行了,可以将光标放到n = 20语句上,这时会在弹出的窗口中显示变量n的数据类型和当前的值,同时在每条变量赋值语句的后面会显示当前变量的值,如图1-20所示。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P27_1797.jpg?sign=1739668258-1WTGOUYBqPib599e8UssmQ6CS2n18uZn-0-68876e7655635c115bd8f047ea003660)
图1-19 Debugger视图
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P27_1798.jpg?sign=1739668258-5p9N6iDcVnMYIoJ5qLKTDKrrfl17l85S-0-a1e1f7b948f6c894ef2985fde427077c)
图1-20 显示变量n的数据类型和当前的值
在Debug视图的上方有一排按钮,如图1-21所示。弯曲箭头的按钮是Step Over,向下箭头的按钮是Step Into。这两个按钮功能是用来一步一步调试代码的。使用Step Into调试代码,当遇到函数、方法等代码块时,会跟踪进入代码块,然后继续一步一步运行代码(单击一下按钮,就会执行一条语句)。使用Step Over调试,如果遇到代码块,会将这个代码块当作一条语句来处理,并不会进入代码块内部。通常来讲,如果用户不能确认代码块中的代码是否正确,建议使用Step Into进行调试,这样可以跟踪每一行代码,如果用户可以保证代码块一定是正确的,那么使用Step Over进行调试会更节省时间。
4.在运行时修改变量的值
断点调试不仅可以跟踪代码,还可以在运行时修改变量的值,这样就不需要每次使用不同的值调试时都重新运行程序了。如果在使用某个变量之前改变该变量的值,那么下次使用该变量时,就会使用新值。
要想修改变量的值,需要在Variables窗口中选中该变量,然后在右键菜单中单击Set Value…菜单项,如图1-22所示。这时该变量处于可编辑状态,如图1-23,直接在文本框中输入新值即可。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P28_1810.jpg?sign=1739668258-DZw9UKesF3q673wFHJoGIHDYVT8T2FpF-0-b21b2e3af84e425ccc5bfab6c0c5e7aa)
图1-21 用于调试的功能按钮
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P28_1811.jpg?sign=1739668258-FhCW8V7ygC84TMupgtcQQ0ls4Vfudndg-0-21aaecdf8392a5ee5d53a7e3d0ce338f)
图1-22 在右键菜单中单击Set Value...菜单项
编辑完变量n的值后,在代码区域,变量后面的当前值提示也会变成修改后的值,但源代码是不会改变的,如图1-24所示。下一次使用变量n,值就会变成100。
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P28_1816.jpg?sign=1739668258-vd3E1GRPvMrgL7OQhogg9mKIfYC3joZG-0-7c7f0615c14b0333741354172f227e8d)
图1-23 该变量处于编辑状态
![](https://epubservercos.yuewen.com/D489BE/26581083109123006/epubprivate/OEBPS/Images/Figure-P28_1817.jpg?sign=1739668258-Jf55twOOt6Q66mN6DoUSfgEYswjc0xHS-0-b8ad8ef5cbab98fe486c7faba8184c39)
图1-24 编辑变量后的效果