使用调试模式执行代码

  1. break b 设置断点
  2. continue c 继续执行程序
  3. list l 查看当前行的代码段
  4. step s 进入函数
  5. return r 执行代码直到从当前函数返回
  6. exit q 中止并退出
  7. next n 执行下一行
  8. pp 打印变量的值
  9. help 帮助
  1. # 使用 -m pdb
  2. python3 -m pdb test.py
  1. """直接运行脚本,会停留在 pdb.set_trace() 处"""
  2. import pdb
  3. a = "aaa"
  4. pdb.set_trace()
  5. b = "bbb"
  6. c = "ccc"
  7. final = a + b + c
  8. print final

脚本执行异常立即进入调试模式

使用 python -i

  1. python3 -i test.py
  2. # 进入交互模式后输入:
  3. import pdb
  4. pdb.pm()

PySnooper 调试神器

https://github.com/cool-RR/PySnooper

安装:pip3 install pysnooper

使用@pysnooper.snoop()装饰函数,可以将函数运行的过程全部记录下来:

  1. 代码的片段、行号等
  2. 函数内局部变量的值如何变化
  3. 函数的返回值
  4. 运行函数消耗的时间
  1. import pysnooper
  2. @pysnooper.snoop()
  3. # @pysnooper.snoop(output='./magic_log.log')
  4. def change_dict(item):
  5. """将匹配的字符串以字典的形式返回
  6. params item: 匹配的字符串
  7. type item: str eg: zaygee
  8. """
  9. return {item: item}
  10. # Source path:... /home/work/tests/base/magic_module.py
  11. # Starting var:.. item = 'zaygee'
  12. # 12:31:24.689309 call 220 def change_dict(item):
  13. # 12:31:24.689637 line 225 return {item: item}
  14. # 12:31:24.689689 return 225 return {item: item}
  15. # Return value:.. {'zaygee': 'zaygee'}
  16. # Elapsed time: 00:00:00.000477
  17. # Starting var:.. item = '20'
  18. # 12:31:24.689804 call 220 def change_dict(item):
  19. # 12:31:24.689867 line 225 return {item: item}
  20. # 12:31:24.689906 return 225 return {item: item}
  21. # Return value:.. {'20': '20'}
  22. # Elapsed time: 00:00:00.000173

将调试信息重定向到日志文件

@pysnooper.snoop(output=’./magic_log.log’) prefix: 设置调试日志输出的前缀

  1. @pysnooper.snoop(output='./magic_log.log', prefix="func: ")
  2. def change_dict(item):
  3. """将匹配的字符串以字典的形式返回
  4. params item: 匹配的字符串
  5. type item: str eg: zaygee
  6. """
  7. return {item: item}

跟踪非局部变量

  1. """
  2. 跟踪非局部变量: @pysnooper.snoop(watch=('foo_values',))
  3. watch_explode: 查看他们的所有列表/字典的属性或项目
  4. """
  5. foo_values = []
  6. val = []
  7. # @pysnooper.snoop(watch=('foo_values', 'val'))
  8. @pysnooper.snoop(watch_explode=('val', 'foo_values'))
  9. def foo(values):
  10. values += 1
  11. foo_values.append(values)
  12. val.append(values)
  13. return values, foo_values, val
  14. foo(values = 10)

设置跟踪函数深度

  1. """
  2. depth=3: 设置跟踪函数的深度
  3. """
  4. foo_values = []
  5. val = []
  6. # @pysnooper.snoop(watch=('foo_values', 'val'))
  7. @pysnooper.snoop(watch_explode=('val', 'foo_values'), depth=3)
  8. def foo(values):
  9. values += 1
  10. foo_values.append(values)
  11. val.append(values)
  12. return values, foo_values, val
  13. foo(values = 10)

设置最大的输出长度

  1. """
  2. max_variable_length=None: 默认超过100字符截断,设置None则表示不截断
  3. """
  4. foo_values = []
  5. val = []
  6. # @pysnooper.snoop(watch=('foo_values', 'val'))
  7. @pysnooper.snoop(watch_explode=('val', 'foo_values'), depth=3, max_variable_length=None)
  8. def foo(values):
  9. values += 1
  10. foo_values.append(values)
  11. val.append(values)
  12. return values, foo_values, val
  13. foo(values = 10)

支持多线程调试

  1. """
  2. thread_info=True: 设置支持多线程调试
  3. """
  4. foo_values = []
  5. val = []
  6. # @pysnooper.snoop(watch=('foo_values', 'val'))
  7. @pysnooper.snoop(watch_explode=('val', 'foo_values'), max_variable_length=None, thread_info=True)
  8. def foo(values):
  9. values += 1
  10. foo_values.append(values)
  11. val.append(values)
  12. return values, foo_values, val
  13. foo(values = 10)

自定义对象格式输出

  1. """
  2. 自定义对象的输出格式
  3. pysnooper.snoop()函数参数custom_repr,接收一个元组对象,可指定特定类型的对象以特定格式输出
  4. custom_repr=(对象,输出格式)
  5. """
  6. class Person:
  7. pass
  8. def prinf_person_obj(obj):
  9. return f"Person {obj.__class__.__name__} {obj.age}"
  10. @pysnooper.snoop(custom_repr=(Person, prinf_person_obj))
  11. def user_func():
  12. person = Person()
  13. person.age = 40
  14. return person
  15. user_func()
  16. # Source path:... /home/work/_script/tests/base/magic_module.py
  17. # 13:37:09.438320 call 271 def user_func():
  18. # 13:37:09.438402 line 272 person = Person()
  19. # New var:....... person = REPR FAILED
  20. # 13:37:09.438450 line 273 person.age = 40
  21. # Modified var:.. person = Person Person 40
  22. # 13:37:09.438527 line 274 return person
  23. # 13:37:09.438583 return 274 return person
  24. # Return value:.. Person Person 40
  25. # Elapsed time: 00:00:00.000347