博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python - 使用pycallgraph生成函数关系图
阅读量:7005 次
发布时间:2019-06-28

本文共 2993 字,大约阅读时间需要 9 分钟。

1- pycallgraph简介

可用于创建python函数关系图,依赖于dot命令,需要先安装 graphviz;
  • HomePage:
  • Docs:
 

2- 安装pycallgraph

安装pycallgraph
$ pip3 install pycallgraph  --proxy=10.144.1.10:8080Collecting pycallgraph  Using cached https://files.pythonhosted.org/packages/ca/2e/fafa56316bc2c5fbfbda898f964137c8b5ef33a876cb1f35a54ff6afbd60/pycallgraph-1.0.1.tar.gzInstalling collected packages: pycallgraph  Running setup.py install for pycallgraph ... doneSuccessfully installed pycallgraph-1.0.1
 
安装graphviz
graphviz( )是一个图形可视化软件(Graph Visualization Software),使用dot文件生成关系图;
  • 下载:
  • 设置环境变量:Advanced System Settings--》Advanced (tab) ---》Environmental Variables then edit the PATH variable.---》"C:\Program Files (x86)\Graphviz2.38\bin"

3- 运行pycallgraph

3-1 直接在命令行方式运行

$ pycallgraph graphviz -- ./test.py
默认将生成一个名为pycallgraph.png的函数关图

3-2 使用API在命令行运行

示例-1
$ cat TempTest.py#! python3# -*- coding: utf-8 -*-def testStr(key):    print("testStr is :", key)$ cat CallGraphTest.py#! python3# -*- coding: utf-8 -*-from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputimport TempTestdef testNum(key):    TempTest.testStr(key)    print("testNum is :", key)g = GraphvizOutput(output_file=r'./trace.png')with PyCallGraph(output=g):    TempTest.testStr("111")    testNum(222)$$ py -3 CallGraphTest.pytestStr is : 111testStr is : 222testNum is : 222$ ls -ltotal 14drwxr-xr-x 1 guowli 1049089    0 May 23 16:07 __pycache__/-rwxr-xr-x 1 guowli 1049089  350 May 23 15:56 CallGraphTest.py*-rwxr-xr-x 1 guowli 1049089   92 May 23 15:59 TempTest.py*-rw-r--r-- 1 guowli 1049089 9141 May 23 16:07 trace.png$

生成指定名称的函数关系图trace.png

 

示例-2

#! python3# -*- coding: utf-8 -*-from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputfrom pycallgraph import Configfrom pycallgraph import GlobbingFilterclass Banana:    def eat(self):        passclass Person:    def __init__(self):        self.no_bananas()    def no_bananas(self):        self.bananas = []    def add_banana(self, banana):        self.bananas.append(banana)    def eat_bananas(self):        [banana.eat() for banana in self.bananas]        self.no_bananas()def main():    graphviz = GraphvizOutput()    graphviz.output_file = 'basic.png'    config = Config()    config.max_depth = 5  # 控制最大追踪深度    with PyCallGraph(output=graphviz, config=config):        person = Person()        for a in range(10):            person.add_banana(Banana())        person.eat_bananas()if __name__ == '__main__':    main()

生成函数关系图

4- 在Pycharm运行objgraph

需要在Pycharm中设置Graphviz环境变量,否则可能报错:
'The command "{}" is required to be in your path.'.format(cmd))pycallgraph.exceptions.PyCallGraphException: The command "dot" is required to be in yourpath.
 
设置Pycharm环境变量步骤:
Run --》Edit Configurations...  --》Default --》Python  --》Environment field group: Environment variables --》 ...  --》+  --》
  • Name: PATH
  • Value: C:\Program Files (x86)\Graphviz2.38\bin

5- 参考信息

  • pycallgraph 追踪Python函数内部调用:
  • 利用graphviz软件和pycallgraph库自动生成Python代码函数调用关系图:

 

转载于:https://www.cnblogs.com/anliven/p/10004665.html

你可能感兴趣的文章