前言
在编写调试Python代码的时候,我们通常有IDE和终端shell命令两种方式,习惯了使用IDE进行调试的朋友短时间可能不习惯使用shell调试,据说用着用着就习惯了,调试小的程序很方便。但是,我目前还是觉得vscode很香。
ipython调试器是对pdb调试器的加强,加强的点在于:tab键补全、语法高亮、异常回溯中每一行的上下文。所以能用ipython就别用pdb了。
什么?没有ipython?
pip install ipython
现在你有了。
文章目录
1. 如何进入调试
1) 代码出错进入调试
调试代码的最佳时机之一就是在发生错误之后。
方式一:在发生错误之后立即输入命令
%debug
可以从出错处开始调试。
方式二:使用以下命令运行test.py文件
%run -d test.py //带d参数的%run命令
当发生错误之后自动进入调试模式。
2) 对编写好的代码进行调试
有时我们并不是要测试一段语法有错的代码,可能是逻辑错误,这时我们不需要在出错时进入。可以使用以下命令:
%run -d b3 test.py //调试代码test.py并从第三行的断点开始调试
没错,和上面方式二的语句是一样的。这里的b3参数意为在第三行设置断点,这是可选的,如果不加,就会在第一行自动加一个断点并运行。
3) 在代码中预设断点进入调试
我们也可以再写代码的时候就埋好断点,那么只要正常运行程序,跑到预设断点的地方,就会自动进入调试,这跟在代码中加print来调试有异曲同工之妙。
-
pdb写法
Python自带pdb模块,在代码中引入pdb模块,并在代码的任意地方调用:import pdb //引入pdb包 pdb.set_trace() //预设断点
则代码会自动进入pdb的调试。
在这里谈到pdb的用法是为下面ipython的调试做一铺垫。用上面的方式只会进入pdb调试,没错,就是那种没有语法高亮,满屏都是字的恐怖调试,而下面讲到的ipython的方法可以让你进入ipython的漂亮调试。
-
ipython写法
//引入方法set_trace from IPython.core.debugger import set_trace //设置断点 set_trace()
设置完断点之后可以直接进入ipdb调试。
2. 调试操作
这一部分主要总结一下在进入调试模式之后,如何进行具体的调试(这里的语法是按照命令行里的语法写的):
1) 调试运行命令
语法 | 功能 | 注释 |
---|---|---|
n | 执行下一行代码 | 不会进入本行的函数体内 |
s | 执行下一行代码 | 会进入本行的函数体内 |
c | 继续执行,直到结束或下一个断点 | |
enter | 重复上一条命令 | 在单步执行时很有用,直接enter,只需输入一次n或s |
restart | 重启刚刚结束的调试 | |
q | 退出调试 |
2) 断点命令
语法 | 功能 | 注释 |
---|---|---|
b n | 在第n行设置断点 | n为行号。每个设置完的断点还有一个断点号。 |
cl | 清除所有断点 | |
cl m | 删除第m号断点 | 注意,m是断点号,不是行号 |
disable m | 关闭第m号断点 | |
enable m | 启用第m号断点 |
注意区分行号和断点号,我们每创建一个断点,都会自动为其分配一个断点号。
3) 变量监控命令
语法 | 功能 | 注释 |
---|---|---|
变量名 | 获取变量 | 直接输入变量名就可以取到变量的值 |
display 表达式 | 计算表达式的值,每次值出现改变都打印出来 | |
undisplay | 停止追踪表达式的值 |
注意:可能会出现变量名和命令名重复的情况,在ipython中是优先命令的,所以查看一个跟命令重名的变量,要在前面加!。
4) 源码查看及定位命令
语法 | 功能 | 注释 |
---|---|---|
list | 显示此刻调试文件的源码 | 设置断点需要知道行号,这个命令就可以看到行号 |
ll | 列出当前函数或帧的全部源代码 | |
a | 显示当前函数的参数列表 | |
w | 查看当前调试执行到哪里 | |
whatis name | 返回变量name的类型 | name是一个变量名,可以是变量名或函数名 |
这是pdb调试官方文档,解释也挺清楚,基本ipython的调试命令和pdb是相同的。
3. vi编辑器部分命令
在使用ipython写程序的时候,难以避免的要使用vi编辑器,那么一些vi的常见命令还有很有用的,这里稍微总结,后面会加。
vi编辑器有三种模式,打开的时候是可视模式,按esc+:进入命令模式,按i进入编辑模式。在不同的模式有不同的命令。
在vi编辑器中,命令是区分大小写的。
1) 命令模式下指令
命令 | 作用 |
---|---|
q | 退出 |
wq | 保存并退出 |
q! | 强制退出 |
syntax on/off | 打开(关闭)语法高亮显示 |
set nu | 显示行号 |
set nu! | 关闭行号显示 |
i | 进入编辑模式 |
以上命令,在不同使用情况下作用的时长和范围不同:
使用方式 | 作用范围 |
---|---|
编辑时在命令状态下输入 | 本次编辑 |
在~/.vimrc中配置 | 对此用户生效 |
在/etc/.vimrc中配置 | 对所有用户生效 |
为了方便,最好是能在vi编辑器的配置文件中进行配置。如果在路径下没有找到.vimrc文件,可以自己创建一个。设置完source的时候可能会提示命令未找到,但是还是会生效的,可以自己试一下。这里有一个很好的vi编辑器配置教程,由于本人目前没打算研究vi编辑器,感兴趣的自己看。
我直接把配置文件搬来了,可以直接复制:
''使得光标横向和纵向选中
highlight CursorLine cterm=NONE ctermbg=black ctermfg=green guibg=NONE guifg=NONE
highlight CursorColumn cterm=NONE ctermbg=black ctermfg=green guibg=NONE guifg=NONE
''自动缩进和对齐
set autoindent
set smartindent
''默认显示行号
set number
''高亮行和列
set cursorcolumn
set cursorline
''高亮显示代码
syntax on
''代码补全
set completeopt=preview,menu
''在处理未保存或只读文件时,弹出确认
set confirm
''tab键的宽度
set tabstop=4
''统一缩进为4
set softtabstop=4
set shiftwidth=4
''可以在buffer的任何地方使用鼠标,类似双击定位
set mouse=a
set selection=exclusive
set selectmode=mouse,key
''搜索忽略大小写
set ignorecase
''搜索逐字符高亮
set hlsearch
set incsearch
''在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\
''高亮显示匹配的括号
set showmatch
''匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1
2) 可视模式下指令
命令 | 作用 |
---|---|
G | 到文件最后一行 |