有些同学在阅读他人所写的代码(比如github)时,往往会对他人定义的参数感到疑惑。因为光从参数的名字不能推断这些参数里究竟保存的是什么样的变量。不少同学只能一遍又一遍的用print来查看参数中保存的变量。遇到不熟悉的类时更是无从下手。
今天介绍一个Python的调试工具,叫做ipdb。有了这个工具我们就能轻易地进行各种调试了。
安装ipdb最简单的方法就是
pip install ipdb
调用ipdb
python -m ipdb script.py
首先说明一下ipdb都有哪些功能。
不仅如此,你还可以直接定义参数和函数、导入模块并且调用他们。
基本操作
我从github中节选了一段代码openai/gym,假设左边的数字代表了代码在源文件中所处的行数。
77 n_elite = int(np.round(batch_size*elite_frac))
78 th_std = np.ones_like(th_mean) * initial_std
79
80 for _ in range(n_iter):
81 ths = np.array([th_mean + dth for dth in th_std[None,:]*np.random.randn(batch_size, th_mean.size)])
82 ys = np.array([f(th) for th in ths])
83 elite_inds = ys.argsort()[::-1][:n_elite]
84 elite_ths = ths[elite_inds]
85 th_mean = elite_ths.mean(axis=0)
86 th_std = elite_ths.std(axis=0)
87 yield {'ys' : ys, 'theta_mean' : th_mean, 'y_mean' : ys.mean()}
1. 我想知道n_elite是什么变量(方框内为直接在命令提示符中输入的内容)
n 回车
连续按回车直到第77行执行完毕
p n_elite
或者
b 78 # 在第78行设置断点
c # 正常执行代码,在断点处停止
p n_elite # 查看n_elite的值
2. 我想知道np是干什么的
pdoc np # 显示np的说明文档,python自带的模块大多有文档。自制模块不一定有
3. 我想知道np的源代码在哪
pinfo np # File后面写的路径就是
4. 我想知道如果把batch_size的值换成其他值的计算结果
int(np.round(255*elite_frac)) # 直接换了数字执行计算
5. 我想知道ths每一次的迭代后的变化
b 83 # 在第83行设置断点
p ths
6. 我想知道程序进程经过断点100次以后的结果
ignore bpnumber 100 # bpnumber是断点的序号
c
p ths
7. 我不需要这个断点了,我想删除它
cl bpnumber # bpnumber是断点的序号
8. 我想知道f是什么函数
source f # 查看f的源代码
9. 我想知道elite_ths除了mean和std以外还有哪些可以调用的参数和函数
pp vars(elite_ths)
pp dir(elite_ths)
10. 我想用pandas来编辑ths
import pandas as pd
ths_df = pd.DataFrame(ths)
11. 我想进入ones_like调试
j 77 # 跳到第77行,不过要注意跳转途中的代码不会被执行,所以有可能出现某参数没被定义的情况
s # 进入到下一步
12. 我当前在ones_like进行调试,我怎么调试n_elite
u # 回到上一层堆栈帧
p n_elite
13. 我当前在ones_like,我想结束调试返回上一层
r # 执行当前函数,返回值
14. 我想查看周围的代码
l或者ll
15. 我忘了怎么使用某个命令
h 某个命令
16. 我想重新调试但不想删除断点
run