作者 | 喵叔

责编 | 刘静

出品 | CSDN(ID:CSDNnews)

对于 python 代码的调试我们通常都是使用 IDE 自带的调试功能。但是 IDE 提供的调试功能存在局限性,例如在测试服务器上调试代码,但是又不可能在测试服务器上安装 IDE 进行调试。这时我们就可以利用下面所讲解的三个工具进行调试。

零、准备调试代码

在讲解三个调试工具前,我们先编写待调试的代码。代码很简单,就是计算两个数的商。我们在编写代码的时候故意留下了除数为 0 的 bug。

def division(start, end):for i in range(start, end, -1):num1 = inum2 = i - 1result = num1 / num2print(result)if __name__ == '__main__':division(10, 0)

PySnooper

PySnooper 是 Python 的第三方工具库,它可以精确的显示代码的执行时间、执行顺序和代码中的局部变量值的变化等。PySnooper 使用方法很简单,只需要将它作为装饰器来使用即可。下面我们来看一下具体使用步骤:

1. 安装 PySnooper
在控制台输入如下命令:

pip install pysnooper等待两秒钟后 PySnooper 安装完成。

2. 加入 PySnooper

  • 首先需要引入 PySnooper

import pysnooper
  • 接着在需要测试的函数上加上 pysnooper 装饰器

@pysnooper.snoop()
def division(start, end):for i in range(start, end, -1):num1 = inum2 = i - 1result = num1 / num2print(result)if __name__ == '__main__':division(10, 0)3. 调试代码

在控制台输入命令:

python text.py运行代码后,控制台输出如下内容

上图只截取了 PySnooper 输出日志的开头内容和最后结尾的内容。从截图中我们可以看到 PySnooper 输出了每行代码的运行顺序、运行时间和代码运行中变量值的变化,以及报错信息。在实际项目中 PySnooper 输出的日志内容会很多,在控制台查看会很不方便,这时我们可以将日志输出到本地文件中,我们只需在 PySnooper 装饰器中加入日志保存路径即可:

@pysnooper.snoop('/app/project_log.log')一些公司对日志输出会有要求,比如每行日志要以某某字符串开头,这时只需在装饰器中加入需要字符穿即可:
@pysnooper.snoop(prefix='MyCompanyName: ')上述所讲的都是 PySnooper 装饰器的常用参数,例如监控自定义表达式、监控底层函数、多线程等 PySnooper 同样支持,具体参数可以在官方项目文档中查看。

前面我们所讲的都是在函数上利用装饰器来监控整个函数,但是在实际项目中往往一个函数内容会很多,如果监控整个函数会导致输出的日志过多,这时我们就可以利用 PySnooper 的局部监控功能来监控函数中需要监控的代码片段。现在我们来修改一下代码,只监控输出的值:

import pysnooperdef division(start, end):for i in range(start, end, -1):with pysnooper.snoop():num1 = inum2 = i - 1result = num1 / num2print(result)if __name__ == '__main__':division(10, 0)上述代码运行后我们就会发现输出的内容少了很多。

Better-exceptions

Better-exceptions 同样是 Python 的第三方工具库,它出现的原因是其实很简单就是“美化异常信息”(是不是感觉作者很任性)。Better-exceptions 主要使用了 Python 的 sys 模块的 excepthook 方法,这个方法在当系统抛出异常时,解释器就会调用它,同时传递三个参数:异常类、异常实例和 traceback 对象,这就说明我们可以重写这个方法来捕获系统异常。但是,因为我们可以重写 excepthook 方法来捕获系统异常,因此 Better-exceptions 对与 Web 框架来说是不起任何作用的,因为 Web 框架都已经处理了系统抛出的异常,不会再以 hook 的方式触发 Better-exceptions 。下面我们就来看一下该怎么用。

  1. 安装 Better-exceptions

  • 首先在控制台输入如下命令:

pip install better-exceptions等待两秒钟后 Better-exceptions 安装完成。
  • 接着我们在控制台输入如下代码,来设置环境变量:

setx BETTER_EXCEPTIONS 1
  1. 调试代码
    在控制台输入命令:

python text.py代码运行后,控制台输出如下图:

从上面的图我们可以看到,Better-exceptions 对异常代码进行了着色,并对产生异常的变量值进行了输出。通过这两项内容我们就可以很快捷的看到具体报错位置和报错原因。
这里有需要注意的地方就是,在 Windows 系统下输出的日志会存在乱码问题,这是因为 Better-exceptions 的编码格式造成的。要解决这个问题我们只需要修改 better-exceptions 目录下的 encoding.py 文件,讲文件中的 ENCODING = locale.getpreferredencoding() 修改为 ENCODING = 'utf-8'即可。

PDB

PDB 是 Python 内置的模块,我们可以利用 PDB 设置断点和跟踪调试。PDB 的使用不需要再安装第三方插件,只需要在命令行输入如下命令:

python -m pdb Test.py命令执行后将会进入 PDB 调试模式。如果需要在代码中加入断点,只需要在需要加入断点的位置加入 pdb.set_trace() 即可。当进入到 PDB 模式后,输入 c 就可以从当前断点直接跳转到下一个断点,如果后续没有断点,则会将剩余代码执行完。当然,如果需要单步执行代码,在控制台输入 s 指令,但是有时主函数会调用大量的其他函数,这时在命令行输入 n 就可以只在主函数中执行单步调试。除了上述指令外,PDB 还有其他指令,如下表:

总结

我们讲解了 PySnooper 、Better-exceptions 和 PDB 的用法,这三种方法一般都使用在服务器上,这里我推荐使用Better-exceptions,因为它对代码的侵入性很小,几乎不需要改变代码。

作者简介:朱钢,笔名喵叔,CSDN博客专家,.NET高级开发工程师,7年一线开发经验,参与过电子政务系统和AI客服系统的开发,以及互联网招聘网站的架构设计,目前就职于北京恒创融慧科技发展有限公司,从事企业级安全监控系统的开发。

声明:本文系作者独立观点,不代表CSDN立场。

【END】

 热 文 推 荐 

☞阿里乌镇大动作:平头哥开源 MCU 设计平台!

☞如何通过 Python 分析中国演员排名?

☞软件核心研发迎来又一春!

☞华为负重疾行

☞为何Google、微软、华为将亿级源代码放一个仓库?从全球最大代码管理库说起

☞计算机专业的学生也太太太太太惨了吧?

☞BTC 固定的货币政策,真的无懈可击吗?

点击阅读原文,参与中国开发者现状调查问卷!

你点的每个“在看”,我都认真当成了喜欢

Python 调试冷知识相关推荐

  1. 链式比较、奇怪的字母、有趣的import...Python冷知识(六)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第六篇. 谈谈 Python 那些不为人知的冷知识(一) 谈谈 Python 那些不为人知的冷知识(二) 谈谈 P ...

  2. 空字符串计数、让字典可排序...Python冷知识(五)

    本文转载自Python编程时光(ID: Python-Time) 冷知识系列,直至今日,已经更新至第五篇.前四篇给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) ...

  3. 反转字符串/列表、改变递归次数限制、else用法...Python 冷知识(四)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第四篇.前三篇传送门在此,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) 谈谈 Pyth ...

  4. for死循环、怪异字符串、两次return……Python冷知识(三)

    本文转载自Python编程时光(ID:Python-Time) 冷知识系列,已经更新至第三篇.前两篇传送门小明给你准备好了,还没阅读的可以学习一下. 谈谈 Python 那些不为人知的冷知识(一) 谈 ...

  5. 谈谈Python那些不为人知的冷知识(二)

    本文转载自Python的编程时光(ID:Python-Time) 小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲 ...

  6. python冷知识_python冷知识

    省略号也是对象 在python中一切皆对象,省略号(...)也是一个对象注意:只能是三个点的省略号 在python中叫做Ellipsis 在python3中能直接得到它 print(...) prin ...

  7. Python那些不为人知的冷知识!(建议收藏)

    01. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

  8. 你所不知道的 Python 冷知识!(建议收藏)

    01. 省略号也是对象 ... 这是省略号,在Python中,一切皆对象.它也不例外. 在 Python 中,它叫做 Ellipsis . 在 Python 3 中你可以直接写-来得到这玩意. > ...

  9. python的运算符号使等式成立_你所不知道的 Python 冷知识!(二)(建议收藏)

    首发于微信公众号:Python编程时光 ' 每周三更新五个冷知识,欢迎前往订阅! 01. 交互式"_"操作符 对于 _ ,我想很多人都非常熟悉. 给变量取名好艰难,用 _: 懒得长 ...

最新文章

  1. RxJava 源码解析之观察者模式
  2. python 命令行参数-Python 中最好用的命令行参数解析工具
  3. 人工智能,也许是另一场文艺复兴!
  4. PAT甲级1010 Radix :[C++题解]进制位、秦九韶算法、二分(PAT通过率最低的一道题0.11)
  5. 如何帮助企业优化商业模式?看精益数据分析的“欺”与“破”
  6. excel 平滑滚动_Excel怎么学 | 图表实战,销售数据的不同表达方式
  7. mysql+create+table+index_mysql------基础及常见SQL技巧
  8. js与c语言效率_JavaScript比c语言的性能差了多少?
  9. Python bytes 函数 - Python零基础入门教程
  10. exit()函数_complete函数
  11. PHP快速获取MySQL数据库表结构
  12. 做一款仿映客的直播App?看我就够了
  13. SpringBoot2.0整合jsp
  14. namenode和datanode的功能分别是什么_海德堡印刷机电路板分别是什么功能
  15. 理性看待360大战腾讯
  16. Windows邮件添加QQ邮箱
  17. mysql数据库表中重命名语句_mysql数据库重命名
  18. 软件工程研究生在读一年总结
  19. 有什么蓝牙耳机好用又不贵?适合学生党的平价蓝牙耳机推荐
  20. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

热门文章

  1. ModelSim6.3 使用教程By Sunev
  2. Python 中文文本分词(包含标点的移除)
  3. [论文阅读] Shallow Attention Network for Polyp Segmentation
  4. Python Matplotlib画图中文乱码、负号无法显示问题解决
  5. 【maven】配置ali镜像
  6. 内是不是半包围结构_什么是自行车变速器上的“倾斜平行四边形”结构?
  7. 《推荐系统笔记(十六)》tf-idf与基于内容的推荐(简单的酒店推荐)
  8. 《推荐系统笔记(八)》GBDT和XgBoost的原理(内含详细数学推导)
  9. slice和map的高级主题
  10. Golang之Channel的理解与应用