2017年11月13日 星期一

Python pycallgraph

Python pycallgraph

文件連結
在python中,如果想追蹤整個程式的執行流程,甚至繪出流程圖的話,可以透過安裝套件『pycallgraph』來實作。

需求套件

pip install pycallgraph

相依套件

graphviz
需求有此套件才有辦法實作

問題排除

參考Stackoverflow
pycallgraph.exceptions.PyCallGraphException: 
The command "dot" is required to be in your path.
在實作的時候不斷的出現此問題,詭異的是,即使透過修正系統環境變數還是一樣。
在透過pyChram中的run\edit config\環境變數調整之後,沒有錯誤訊息,但是執行之後也無法產生圖面。


最後透過import os來做環境變數的調整,就正常了。
import os
os.environ["PATH"] += os.pathsep + r'C:/Program Files (x86)/Graphviz2.38/bin/'

排除題外話

在查詢git上的issues的時候也發現其它問題,似乎在windows上有點小毛病。
git

範例

範例取自官方,只是加入了import os
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
#!/usr/bin/env python
"""
This example demonstrates a simple use of pycallgraph.
"""
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
#  手動自己加入
import os
os.environ["PATH"] += os.pathsep + r'C:/Program Files (x86)/Graphviz2.38/bin/'

class Banana:

    def eat(self):
        pass


class 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'

    with PyCallGraph(output=graphviz):
        person = Person()
        for a in xrange(10):
            person.add_banana(Banana())
        person.eat_bananas()


if __name__ == '__main__':
    main()
透過with實作PyCallGraph,完成之後會在專案底下看到basic.png!

進階範例

實作進階的部份設置多為過濾掉不想要的,或是設置最深階度。

最深階度

from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph.output import GraphvizOutput


#  max_depth設置最深追蹤梯度
config = Config(max_depth=1)
graphviz = GraphvizOutput(output_file='basic.png')

with PyCallGraph(output=graphviz, config=config):
    #  這邊加入你要追蹤的項目

過濾

from pycallgraph import PyCallGraph
from pycallgraph import Config
from pycallgraph import GlobbingFilter
from pycallgraph.output import GraphvizOutput


config = Config()
config.trace_filter = GlobbingFilter(exclude=[
    'pycallgraph.*',
    '*.secret_function',
])

graphviz = GraphvizOutput(output_file='basic.png')

with PyCallGraph(output=graphviz, config=config):
    #  這邊加入你要追蹤的項目

沒有留言:

張貼留言