Python pycallgraph
文件連結在python中,如果想追蹤整個程式的執行流程,甚至繪出流程圖的話,可以透過安裝套件『pycallgraph』來實作。
需求套件
pip install pycallgraph
相依套件
graphviz需求有此套件才有辦法實作
問題排除
參考Stackoverflowpycallgraph.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):
# 這邊加入你要追蹤的項目
沒有留言:
張貼留言