假设我们有一段程序, 从 Redis 中读取数据, 解析以后提取出里面的 name 字段:
- import JSON
- import Redis
- client = Redis.Redis()
- def read():
- while True:
- data = client.lpop('info')
- if data:
- yield JSON.loads(data)
- else:
- break
- def parse():
- for data in self.read():
- print(data['name'])
- if __name__ == '__main__':
- parse()
代码的逻辑本身很简单, 从 Redis 中一条一条读取数据, 读到的数据是 JSON 字符串, 所以先使用 JSON.loads 解析成字典. 然后读取字典中的 name 对应的值. 一直读到 Redis 列表为空.
我们运行一下看看:
报错了, 说明 Redis 中的某一条数据有问题. 你想看看这条有问题的数据, 但是现在程序已经崩溃了, 进程结束了, 这条有问题的数据也就永久丢失了. 你再也不可能知道它长什么样了.
玩过《火焰纹章 - 风花雪月》的朋友都知道, 主角有一个技能叫做天刻之脉动, 如果队友死了, 他可以逆转时间, 回到队友被杀之前, 从而改变队友的命运.
那么, 在 Python 里面我们有没有什么办法让程序起死回生, 看到当初导致程序报错的那一行代码呢? 如果你是使用 python3 xxx.py 运行的程序, 那么确实, 除非你能重新导入刚才的数据, 否则无法知道.
但是, 如果你是使用如下命令: python3 -i xxx.py 启动的程序, 那么世界就不一样了, 你的程序获得了起死回生的能力. 你可以重新回到事故现场.
我们恢复一下 Redis 的数据 (当然, 在生产环境里面你可能就没有办法恢复了. 但现在写文章的示例数据, 我还是可以回复的 ^_^)
然后使用 python3 -i read_name.py 重新运行这个程序:
可以看到, 现在虽然程序崩溃了, 但是却出现了 Python 的交互环境. 进程并没有完全退出. 这样一来, 我们就可以输入魔法指令, 让程序倒退回到报错的那个地方. 输入命令:
import pdbpdb.pm()
运行效果如下图所示:
现在, 我们已经回到了报错的那一行了. 报错报的是 data 这个字典没有 name 这个 key, 那么我们就来看看这个字典里面有什么, 直接输入变量名 data:
原来, 这一条有问题的数据, 是把 name 写成了 name1.
总结
pdb 是 Python 自带的调试工具. 我们使用的 PyCharm 的调试功能, 也是基于 pdb 实现的.
来源: https://www.cnblogs.com/zwhy8/p/13179379.html