使用调试模式执行代码
break 或 b : 设置断点continue 或 c: 继续执行程序list 或 l: 查看当前行的代码段step 或 s: 进入函数return 或 r: 执行代码直到从当前函数返回exit 或 q: 中止并退出next 或 n: 执行下一行pp: 打印变量的值help: 帮助
# 使用 -m pdbpython3 -m pdb test.py
"""直接运行脚本,会停留在 pdb.set_trace() 处"""import pdba = "aaa"pdb.set_trace()b = "bbb"c = "ccc"final = a + b + cprint final
脚本执行异常立即进入调试模式
使用 python -i
python3 -i test.py# 进入交互模式后输入:import pdbpdb.pm()
PySnooper 调试神器
https://github.com/cool-RR/PySnooper
安装:pip3 install pysnooper
使用@pysnooper.snoop()装饰函数,可以将函数运行的过程全部记录下来:
- 代码的片段、行号等
 - 函数内局部变量的值如何变化
 - 函数的返回值
 - 运行函数消耗的时间
 
import pysnooper@pysnooper.snoop()# @pysnooper.snoop(output='./magic_log.log')def change_dict(item):"""将匹配的字符串以字典的形式返回params item: 匹配的字符串type item: str eg: zaygee"""return {item: item}# Source path:... /home/work/tests/base/magic_module.py# Starting var:.. item = 'zaygee'# 12:31:24.689309 call 220 def change_dict(item):# 12:31:24.689637 line 225 return {item: item}# 12:31:24.689689 return 225 return {item: item}# Return value:.. {'zaygee': 'zaygee'}# Elapsed time: 00:00:00.000477# Starting var:.. item = '20'# 12:31:24.689804 call 220 def change_dict(item):# 12:31:24.689867 line 225 return {item: item}# 12:31:24.689906 return 225 return {item: item}# Return value:.. {'20': '20'}# Elapsed time: 00:00:00.000173
将调试信息重定向到日志文件
@pysnooper.snoop(output=’./magic_log.log’) prefix: 设置调试日志输出的前缀
@pysnooper.snoop(output='./magic_log.log', prefix="func: ")def change_dict(item):"""将匹配的字符串以字典的形式返回params item: 匹配的字符串type item: str eg: zaygee"""return {item: item}
跟踪非局部变量
"""跟踪非局部变量: @pysnooper.snoop(watch=('foo_values',))watch_explode: 查看他们的所有列表/字典的属性或项目"""foo_values = []val = []# @pysnooper.snoop(watch=('foo_values', 'val'))@pysnooper.snoop(watch_explode=('val', 'foo_values'))def foo(values):values += 1foo_values.append(values)val.append(values)return values, foo_values, valfoo(values = 10)
设置跟踪函数深度
"""depth=3: 设置跟踪函数的深度"""foo_values = []val = []# @pysnooper.snoop(watch=('foo_values', 'val'))@pysnooper.snoop(watch_explode=('val', 'foo_values'), depth=3)def foo(values):values += 1foo_values.append(values)val.append(values)return values, foo_values, valfoo(values = 10)
设置最大的输出长度
"""max_variable_length=None: 默认超过100字符截断,设置None则表示不截断"""foo_values = []val = []# @pysnooper.snoop(watch=('foo_values', 'val'))@pysnooper.snoop(watch_explode=('val', 'foo_values'), depth=3, max_variable_length=None)def foo(values):values += 1foo_values.append(values)val.append(values)return values, foo_values, valfoo(values = 10)
支持多线程调试
"""thread_info=True: 设置支持多线程调试"""foo_values = []val = []# @pysnooper.snoop(watch=('foo_values', 'val'))@pysnooper.snoop(watch_explode=('val', 'foo_values'), max_variable_length=None, thread_info=True)def foo(values):values += 1foo_values.append(values)val.append(values)return values, foo_values, valfoo(values = 10)
自定义对象格式输出
"""自定义对象的输出格式pysnooper.snoop()函数参数custom_repr,接收一个元组对象,可指定特定类型的对象以特定格式输出custom_repr=(对象,输出格式)"""class Person:passdef prinf_person_obj(obj):return f"Person {obj.__class__.__name__} {obj.age}"@pysnooper.snoop(custom_repr=(Person, prinf_person_obj))def user_func():person = Person()person.age = 40return personuser_func()# Source path:... /home/work/_script/tests/base/magic_module.py# 13:37:09.438320 call 271 def user_func():# 13:37:09.438402 line 272 person = Person()# New var:....... person = REPR FAILED# 13:37:09.438450 line 273 person.age = 40# Modified var:.. person = Person Person 40# 13:37:09.438527 line 274 return person# 13:37:09.438583 return 274 return person# Return value:.. Person Person 40# Elapsed time: 00:00:00.000347
