• python函数调用关系图(python call graph)


    由于要重构项目的部分代码,要整理好主要的函数调用关系,不想自己看代码慢慢画出结构,想找出一种通用的,节省人力的方法得出函数间的调用关系图,于是发现以下几个工具。(内网没装好graphviz,还没真正用上)

    主要分下面三个模块了解一下python中如何生成函数关系调用图:

    1、graphviz(Graph Visualization Software-图形可视化软件)

    2、pycallgraph(创建python的可视化图形)

    3、objgraph(查看python对象图)


    1、graphviz

     graphviz 是一个图形可视化软件,可使用dot文件生成关系图。

    1.1、下载安装

    官网下载安装包进行安装,有Linux和Windows版本。

    或者直接用命令安装: sudo apt-get install graphviz

    1.2、使用

    安装后可使用dot命令将dot文件生成图片:

    dot -Tpng *.dot -o *.png

    更多用法可参考官网文档。

    http://www.graphviz.org/Home.php

    还有一个pygraphviz 不要和 下面介绍的pycallgraph混淆了。pygraphviz是用Python封装了graphviz使其可用python编写。

    pygraphviz官网:http://pygraphviz.github.io/index.html


     2、pycallgraph

     pycallgraph 可以创建python函数关系可视化图形,因为其依赖于dot命令,需要先安装 graphviz。

    2.1、下载安装

    官网源码安装或使用pip:

    pip install pycallgraph

    2.2、使用

    命令行使用(没试过):

    pycallgraph graphviz -- ./mypythonscript.py

    代码中使用:

    from pycallgraph import PyCallGraph
    from pycallgraph.output import GraphvizOutput
    
    with PyCallGraph(output=GraphvizOutput()):
        code_to_profile()

    例子:

     1 #!/usr/bin/env python
     2 '''
     3 This example demonstrates a simple use of pycallgraph.
     4 '''
     5 from pycallgraph import PyCallGraph
     6 from pycallgraph.output import GraphvizOutput
     7 
     8 
     9 class Banana:
    10 
    11     def eat(self):
    12         pass
    13 
    14 
    15 class Person:
    16 
    17     def __init__(self):
    18         self.no_bananas()
    19 
    20     def no_bananas(self):
    21         self.bananas = []
    22 
    23     def add_banana(self, banana):
    24         self.bananas.append(banana)
    25 
    26     def eat_bananas(self):
    27         [banana.eat() for banana in self.bananas]
    28         self.no_bananas()
    29 
    30 
    31 def main():
    32     graphviz = GraphvizOutput()
    33     graphviz.output_file = 'basic.png'
    34 
    35     with PyCallGraph(output=graphviz):
    36         person = Person()
    37         for a in xrange(10):
    38             person.add_banana(Banana())
    39         person.eat_bananas()
    40 
    41 
    42 if __name__ == '__main__':
    43     main()
    View Code

    运行代码,生成basic.png:

    官网:

    http://pycallgraph.slowchop.com/en/master/index.html


     3、objgraph

    ( objgraph 和函数关系调用没什么关系,但是由于也使用dot,所以一并介绍。)

    objgraph模块 一般用于分析python对象相关问题,如内存泄漏。

    3.1、下载安装

    可官网源码安装,也可使用pip安装:

    pip install objgraph

    3.2、使用

    生成图片:

    更多用法可参考官网:

    http://mg.pov.lt/objgraph/

  • 相关阅读:
    weblogic 未授权命令执行漏洞(CVE-2020-14882,CVE-2020-14883)复现
    sqlmap之--os-shell命令执行原理
    HTTP协议层面绕过WAF
    windows下过安全狗
    [SUCTF 2019]Pythonginx
    warmup(HCTF 2018)
    phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
    phpMyAdmin写入WebShell(二)
    phpMyAdmin写入WebShell(一)
    [SUCTF 2019]EasySQL
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/7155684.html
Copyright © 2020-2023  润新知