使用spyder3调试python程序的简明教程

说是简明教程,其实是我自己尝试用spyder调试python程序的过程的一个记录,因为spyder的调试功能是基于pdb,而我又没有pdb的基础,所以刚开始上手时感觉很不习惯,而且那时我又很懒,没去找官方文档,仅仅在百度和csdn上找了找,没找到比较好的资料,于是放弃了,过了一段时间之后,突然又心血来潮去找了官方文档,外加自己的一些尝试,总算入门了spyder的调试功能,特地记录下来与大家共享,我使用的spyder版本是3.1.4(使用pip list命令查看spyder版本)

Spyder官方文档地址

http://pythonhosted.org/spyder/

先写一个简单的小程序用于调试:

# -*- coding: utf-8 -*-
Created on Mon Aug 28 23:59:40 2017
@author: 燃烧杯
a = 'a'
b = 'b'
c = 'c'
e = 'e'
f = 'f'
g = 'g'
h = 'h'
print(a)

我们暂时先不打断点,用debug的方式运行该代码试试

first_debug_end

程序执行结束,可见即使我们没有打断点,仍然会在第一句执行之前中断(经测试,中断的时候第一句还没有执行),这个和我用过的其他编译器不太一样(比如eclipse和IntelliJ,在不打断点的情况下会正常执行到底),一开始还让我困惑了一下,后来就适应了.
如果你仔细看刚才的工具栏截图的话,会发现在debug按钮组的第五个按钮和刚刚的'c'命令是一样的功能,但是不知道为什么,在我这个版本的spyder里有这个按钮一些bug(具体来说就是在程序执行结束之后不会自动退出pdb,而且之后再想使用'q'命令退出也退出不了,换而言之,就是卡死在了pdb里面),如果你使用的是更高版本的spyder的话,这个bug可能已经修复了,可以尝试一下.

打断点的两种姿势

普通的breakpoint

用spyder打断点的方法非常简单,只要在想打断点的那一行行首双击鼠标即可,如图所示,我们尝试建立一个断点:

!(python语句)的意思就是在当前状态下执行该python语句,我刚刚的用法的意思显然是查看变量内容,从!f 的错误信息可以看出f尚未定义,即第12行代码(f='f')还没有执行,查看e变量发现e变量已经被定义了,这说明第11行已经执行结束了。通过以上实验可以看出,spyder会在断点语句的执行之前中断

带条件的breakpoint

双击刚刚在第12行代码开头创建的“小红点”即可取消断点。
按住Ctrl+Shift,然后像刚才一样双击第12行行首,会弹出一个小框:

condition_break

如果忘记了条件断点的条件是什么的话,可以按住Ctrl+Shift键双击“带问号的小红点”,然后就能看见条件是什么了,而且还可以修改条件,如果要取消断点的话,直接双击就可以了。

总结一下刚刚所讲的

Ctrl+F5 以Debug模式运行文件
  • 在debug之前记得用%reset 指令清空一下ipython工作空间中的变量,以免影响debug中变量值的查看
  • 无论你是否打断点,都会在第一行语句执行之前中断一次
  • !(python语句)可以在pdb提示符下执行python语句,可以用来查看变量值或者给变量临时指定值
  • c命令或者Ctrl+F12可以让程序执行到下一个断点
  • q命令退出调试
  • Ctrl+F10 单行执行
  • 双击行首设置断点,按住Ctrl+Shift 双击行首可以设置条件断点
  • 剩下的一些细节

    上面的例子已经包括了大多数常用的功能,如果曾经用过别的编译器的调试功能的话(如eclipse和IntelliJ等),看到这里就可以了,对于有调试经验的人来说,我下面要讲的两个功能只要看到按钮的名称就大概知道它是做什么的了.

    Step Into

    上面一张图的按钮的功能我们称之为Step Into(下面一张图的按钮的功能我们称之为return),用于进入一个函数体内部,为了更清楚的说明它的功能,我们给出一个例子,在spyder中创建如下程序:

    # -*- coding: utf-8 -*-
    Created on Tue Aug 29 14:22:46 2017
    @author: 燃烧杯
    def myTest():
        c = 'a'
        d = 'b'
        e = 'c'
        return c
    a = 'a'
    b = 'b'
    c = myTest()
    f = 'f'
    print(a)
    

    我们开始debug,不断地按Ctrl+F10 单行执行这个程序,当运行到c = myTest() 这句时注意一下:

    这就Step Into的主要功能.

    Return