2个有用的Python命令行下可视化、调试、分析工具

2022-08-26 13:15:40

loguru - 打印日志(特别是异常的详细信息)

loguru本身是一个日志库,跟logging库差不多,但是它还支持更丰富的一些功能,其中一项就是它可以显示抛出异常时的调用栈和各参数值。
使用方法很简单,我们只用使用loguru.logger.catch装饰我们要显示详细异常信息的函数即可。

比如下面的例子里,我建立了两个函数,一个fun_raw不用装饰器,fun_catch使用装饰器。它们的作用都是调用basic函数。我这里之所以多搞出一层basic函数,是为了展示调用栈的返回效果。

from loguruimport logger
my_list=[1,2,3]
my_dict={'a':'b'}defbasic(a,b):return a+bdeffun_raw(a, b):
    t= basic(a,b)return t

@logger.catchdeffun_catch(a, b):
    t= basic(a,b)return t

下面我们调用基本的函数,会得到普通的异常信息。

fun_raw(my_list, my_dict)# 输出的异常信息如下:---------------------------------------------------------------------------
TypeError
Traceback(most recent call last)<ipython-input-5-339452031bfc>in<module>()---->1 fun_raw(my_list, my_dict)<ipython-input-4-b6eabadbdba9>in fun_raw(a, b)78deffun_raw(a, b):---->9     t= basic(a,b)10return t11<ipython-input-4-b6eabadbdba9>in basic(a, b)45defbasic(a,b):---->6return a+b78deffun_raw(a, b):

TypeError: can only concatenatelist(not"dict") tolist

下面我们调用使用装饰器装饰后的函数,我们会得到包含参数值的详细调用栈信息。

fun_raw(my_list, my_dict)# 输出的部分异常信息如下:---------------------------------------------------------------------------> File"<ipython-input-6-943019db22e9>", line1,in<module>
    fun_catch(my_list, my_dict)
    │         │        └{'a':'b'}
    │         └[1,2,3]<function fun_catch at0x7f0e34b138c0>
  File"<ipython-input-4-b6eabadbdba9>", line14,in fun_catch
    t= basic(a,b)
        │     │ └{'a':'b'}
        │     └[1,2,3]<function basic at0x7f0e5ac99050>
  File"<ipython-input-4-b6eabadbdba9>", line6,in basicreturn a+b
           │ └{'a':'b'}[1,2,3]

TypeError: can only concatenatelist(not"dict") tolist

项目主页:https://github.com/Delgan/loguru
安装方法:

pipinstall loguru

snoop - 打印执行情况

它可以显示每一行正在执行的代码,以及这一行代码的行号、变量值、返回值、执行时间。对于研究代码行为、分析异常原因非常有用,特别是使用jupyter的时候。

它的使用也非常容易,可以直接用@snoop装饰要分析的函数,或者使用with snoop:语法来包裹要分析的部分。

下面这个例子里,我实现了一个将一个数字转换成它的二进制表示的小函数。

import snoop

@snoopdefnumber2bits(number):
    bits=[]while number:
        number, remainder=divmod(number,2)
        bits.insert(0, remainder)return bits

number2bits(5)

我们来分析它在参数值为5的时候的执行过程。

01:09:55.71>>> Call to number2bitsin File"<ipython-input-10-501aa33d50e5>", line401:09:55.71...... number=501:09:55.714|defnumber2bits(number):01:09:55.715|     bits=[]01:09:55.716|while number:01:09:55.727|         number, remainder=divmod(number,2)01:09:55.72.............. number=201:09:55.72.............. remainder=101:09:55.728|         bits.insert(0, remainder)01:09:55.72.............. bits=[1]01:09:55.72..............len(bits)=101:09:55.726|while number:01:09:55.727|         number, remainder=divmod(number,2)01:09:55.73.............. number=101:09:55.73.............. remainder=001:09:55.738|         bits.insert(0, remainder)01:09:55.73.............. bits=[0,1]01:09:55.73..............len(bits)=201:09:55.736|while number:01:09:55.737|         number, remainder=divmod(number,2)01:09:55.73.............. number=001:09:55.73.............. remainder=101:09:55.738|         bits.insert(0, remainder)01:09:55.73.............. bits=[1,0,1]01:09:55.73..............len(bits)=301:09:55.736|while number:01:09:55.749|return bits01:09:55.74<<< Return valuefrom number2bits:[1,0,1][1,0,1]

项目主页:https://github.com/alexmojaki/snoop
https://pypi.org/project/snoop/
它的功能很丰富,更多的功能可用参考项目主页。
安装方法:

pipinstall snoop

heartrate - 显示实时执行情况

它不是在命令行下直接显示的,但是功能也很强大,所以也介绍一下。它是snoop的作者在snoop的基础上开发的。它可用实时显示Python程序的运行情况。
运行下面的命令之后,它会在本地的9999端口开启一个web page。然后我们可以通过http://localhost:9999/打开,使用浏览器观察代码运行情况。当然这些都是可以改的。而且除了直接监视后续运行的代码,也可以指定特定文件。

import heartrate
heartrate.trace(browser=True)

下图是来自官方主页的效果动图,它实时显示了merge_sort算法在执行过程中各行代码的执行次数。我们可以把它当做一个profiler来用。
heartrate 运行效果

项目主页:https://github.com/alexmojaki/heartrate
安装方法:

pipinstall heartrate
  • 作者:yanxiangtianji
  • 原文链接:https://blog.csdn.net/yanxiangtianji/article/details/116287735
    更新时间:2022-08-26 13:15:40