python debug
debug方法千千万,分析一下这些可以分成哪几类?
- 直接看报错结果:比较清晰看到出错位置- 鸵鸟算法。。。
- 抛出异常
- logging
 
- 中途print:要求知道出错地方大致在哪里- assert
 
- 控制- IDE 断点调试
- pdb
 
Outline
- assert介绍
- logging介绍
- pdb介绍(ipdb为增强版pdb)
Assert
assert expression [, arguments]
assert condition "sentence"
判断条件是否成立,如果不成立,则打印后面的句子并且结束程序
等价于
if not expression:
    raise AssertionError
eg
import sys
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
Logging
基础介绍
logging是系统内置库,可以看作print的plus版,对于大一些的项目logging比print更合适。
logging日志有级别,在开发时可以打印所有的信息,帮助我们进行debug等;在项目上线时可能只需要打印info以上的信息。这种分级的打印减少开发与部署之间代码的改动
 
import logging  # 引入logging模块
# 将信息打印到控制台上
logging.debug(u"aaa")
logging.info(u"bbb")
logging.warning(u"ccc")
logging.error(u"ddd")
logging.critical(u"fff")
默认只打印warning以及以上的内容,手动设置级别只需简单配置一下
logging.baseConfig(level=logging.DEBUG)
需要注意的是,logging打印出的日志信息与print打印的信息在控制台上的顺序和代码中的顺序不一定是一致的,因为logging要控制并发的日志做了并发的处理;但是logging自己的打印信息顺序是正常的
更多功能
- 输出到指定文件中(但此时不会显示在控制台中)(默认下次运行会追加内容) - logging.baseConfig(filename='debug.log', level=logging.DEBUG) # 参数介绍 # filemode: 写入模式 w a # format = "%{asctime}s|%{levelname}s|%{filename}s:%{lineno}s|%{message}s" # datefmt = "%Y-%m-%d %H:%M:%S"
- 当出现错误时用try except来接住错误,并使用logging记录下来(用这种方法相比于直接看结果的缺点是缺少回溯信息) - try: xxx except Exception as e: print('Error:',e) print(e.args) print(e.with_traceback()) # Traceback logging.critical(e)- 若想打印回溯信息 - e.with_traceback()
pdb
pdb是一种替代IDE在控制台进行调试的方法
pdb 模块定义了一个交互式源代码调试器,用于 Python 程序。它支持在源码行间设置(有条件的)断点和单步执行,检视堆栈帧,列出源码列表,以及在任何堆栈帧的上下文中运行任意 Python 代码。它还支持事后调试,可以在程序控制下调用。调试器的提示符是 (Pdb)
有两种使用方法
- 侵入式:在python代码中加入pdb - import pdb pdb.set_trace() # 基本类似于设断点
- 非侵入式:不用额外修改源代码,在命令行下直接运行就能调试 - python -m pdb xxx.py
进入pdb调试界面后使用命令进行设断点、单步调试、打印变量等进一步调试
| 命令 | 使用方法 | 作用 | 
|---|---|---|
| h | h or h 【cmd】 | 查看帮助 | 
| b | b 3 b filename:line_no b line_no | (第三行)设置断点 | 
| b | b function | 在函数function的第一条可执行语句处添加断点 | 
| tbreak | - | 临时断点,在第一次命中时会自动删除。它的参数与 break 相同 | 
| l | l | 打印当前环境上下文代码 | 
| n | n | |
| c | c | 继续执行(当后面存在断点时会再次暂停) | 
| cl | - | 清除断点 | 
| s | s | 执行下一条命令(step) | 
| r | r | 继续运行,直到当前函数返回(return) | 
| n | n | 执行下一条语句(next) | 
| 【cmd】 | - | 像ipython一样控制程序 | 
| a | a | (args)列出当前执行函数的参数,查看函数参数 | 
| p | p | (print)输出expression的值,打印变量值 | 
| q | q | 推出debug | 

 
         
                   
                   
                   
           
              