美文网首页
PySnooper Python 打印函数执行流程模块

PySnooper Python 打印函数执行流程模块

作者: 河码匠 | 来源:发表于2019-10-22 11:17 被阅读0次

PySnooper 可以打印出 Python 执行代码的全流程和每行代码的执行时间,以及执行过程中变量的变化。

安装 PySnooper

$ pip install pysnooper

简单示例

import pysnooper

@pysnooper.snoop()
def text(number):
    new_list = []
    for i in range(number):
        new_list.append(i * 2)
    return new_list
text(6)

效果

Source path:... text.py
Starting var:.. number = 6
10:45:31.237191 call         5 def text(number):
10:45:31.237644 line         6     new_list = []
New var:....... new_list = []
10:45:31.237732 line         7     for i in range(number):
New var:....... i = 0
10:45:31.237849 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0]
10:45:31.237941 line         7     for i in range(number):
Modified var:.. i = 1
10:45:31.238024 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0, 2]
10:45:31.238088 line         7     for i in range(number):
Modified var:.. i = 2
10:45:31.238157 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0, 2, 4]
10:45:31.238229 line         7     for i in range(number):
Modified var:.. i = 3
10:45:31.238303 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0, 2, 4, 6]
10:45:31.238364 line         7     for i in range(number):
Modified var:.. i = 4
10:45:31.238432 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0, 2, 4, 6, 8]
10:45:31.238500 line         7     for i in range(number):
Modified var:.. i = 5
10:45:31.238570 line         8         new_list.append(i * 2)
Modified var:.. new_list = [0, 2, 4, 6, 8, 10]
10:45:31.238640 line         7     for i in range(number):
10:45:31.238713 line         9     return new_list
10:45:31.238767 return       9     return new_list
Return value:.. [0, 2, 4, 6, 8, 10]

可以很明显看到每次循环的操作和变量的变化。

其他操作

  • 把输出内容写入文件
@pysnooper.snoop('/my/log/file.log')
  • 显示函数调用的其他函数的执行过程
@pysnooper.snoop(depth=2)

示例

import pysnooper

class Text():
    @pysnooper.snoop(depth=2)
    def a(self, param):
        return self.b(param)

    def b(self, param):
        new_list = []
        for i in range(param):
            new_list.append(i * 2)

Text().a(2)
  • 给输出的行加前缀
@pysnooper.snoop(prefix='aaa ')

示例

import pysnooper

class Text():
    @pysnooper.snoop(prefix='aaa ')
    @pysnooper.snoop(depth=2)
    def a(self, param):
        return self.b(param)

    def b(self, param):
        new_list = []
        for i in range(param):
            new_list.append(i * 2)

Text().a(2)

结果
\color{red}{注意}:这里的 pysnooper.snoop 顺序对结果有影响。

aaa Source path:... /Users/machao/Documents/PythonVirtual/SpeedyCloud/lib/python2.7/site-packages/pysnooper/tracer.py
aaa Starting var:.. args = (<__main__.Text instance at 0x101da2bd8>, 2)
aaa Starting var:.. kwargs = {}
aaa Starting var:.. function = <function a at 0x101da96e0>
aaa Starting var:.. self = <pysnooper.tracer.Tracer instance at 0x101da2b48>
aaa 11:15:53.951363 call       254         def simple_wrapper(*args, **kwargs):
aaa 11:15:53.954333 line       255             with self:
aaa 11:15:53.954468 line       256                 return function(*args, **kwargs)
    Source path:... /Users/machao/Desktop/licens.py
    Starting var:.. self = <__main__.Text instance at 0x101da2bd8>
    Starting var:.. param = 2
    11:15:53.954581 call         6     def a(self, param):
    11:15:53.954993 line         7         return self.b(param)
        Starting var:.. self = <__main__.Text instance at 0x101da2bd8>
        Starting var:.. param = 2
        11:15:53.955131 call         9     def b(self, param):
        11:15:53.955316 line        10         new_list = []
        New var:....... new_list = []
        11:15:53.955506 line        11         for i in range(param):
        New var:....... i = 0
        11:15:53.955675 line        12             new_list.append(i * 2)
        Modified var:.. new_list = [0]
        11:15:53.955818 line        11         for i in range(param):
        Modified var:.. i = 1
        11:15:53.956045 line        12             new_list.append(i * 2)
        Modified var:.. new_list = [0, 2]
        11:15:53.956168 line        11         for i in range(param):
        11:15:53.956281 return      11         for i in range(param):
        Return value:.. None
    11:15:53.956454 return       7         return self.b(param)
    Return value:.. None
aaa Call ended by exception
  • 在执行线程的函数时打印内容
@pysnooper.snoop(thread_info=True)
  • 控制最长输出
@pysnooper.snoop(max_variable_length=200)

相关文章

  • PySnooper Python 打印函数执行流程模块

    PySnooper 可以打印出 Python 执行代码的全流程和每行代码的执行时间,以及执行过程中变量的变化。 安...

  • DeBug Python代码全靠print函数?换用这个一天2K

    print 函数已老,DeBug 该靠 PySnooper 了~ 小伙伴们,你们都怎样 DeBug Python ...

  • 调用外部命令/可执行文件

    Python中可以执行shell命令的相关模块和函数有: 随着Python版本的更新,过多的模块引起代码的复杂与冗...

  • head first python(第二章)–学习笔记

    head first python(第二章)--学习流程图 1.函数转换为模块 函数转换为模块后,就可以灵活的使用...

  • python 高级

    包和模块 模块: 模块就是一个保存了python代码的文件,模块能定义函数,类和变量。模块也能包含可执行的代码。...

  • 命令执行

    命令行执行漏洞介绍 应用程序钟又是需要调用一些执行系统命令的函数,如Python的os模块提供了很多函数来执行系统...

  • Can't get source code for a meth

    研究Python自省时发现的一个问题 python inspect 模块无法读取exec所创建的函数的源代码 执行...

  • Python  C6-1——时间模块初体验

    今天的知识点是对Python中的时间模块和相应函数有个初步认识。 实现代码倒入时间模块,打印time.ti...

  • SaltStack:编写自己的模块代码

    Salt的执行模块函数并没有什么特别之处,它们实际上就是Python函数,但是当它们结合上Salt的远程执行功能就...

  • Python 模块

    关键词:模块 模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码(类比...

网友评论

      本文标题:PySnooper Python 打印函数执行流程模块

      本文链接:https://www.haomeiwen.com/subject/jhzfvctx.html