使用调试模式执行代码
break 或 b : 设置断点
continue 或 c: 继续执行程序
list 或 l: 查看当前行的代码段
step 或 s: 进入函数
return 或 r: 执行代码直到从当前函数返回
exit 或 q: 中止并退出
next 或 n: 执行下一行
pp: 打印变量的值
help: 帮助
# 使用 -m pdb
python3 -m pdb test.py
"""直接运行脚本,会停留在 pdb.set_trace() 处"""
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
脚本执行异常立即进入调试模式
使用 python -i
python3 -i test.py
# 进入交互模式后输入:
import pdb
pdb.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 += 1
foo_values.append(values)
val.append(values)
return values, foo_values, val
foo(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 += 1
foo_values.append(values)
val.append(values)
return values, foo_values, val
foo(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 += 1
foo_values.append(values)
val.append(values)
return values, foo_values, val
foo(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 += 1
foo_values.append(values)
val.append(values)
return values, foo_values, val
foo(values = 10)
自定义对象格式输出
"""
自定义对象的输出格式
pysnooper.snoop()函数参数custom_repr,接收一个元组对象,可指定特定类型的对象以特定格式输出
custom_repr=(对象,输出格式)
"""
class Person:
pass
def 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 = 40
return person
user_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