2012-10-31 14 views
15

我在命令行中使用pycallgraph來描繪​​和繪製一個相對簡單的程序的調用圖。然而,即使我不使用-s命令行選項,結果圖像也包含標準庫的內部結構(線程,json,套接字)。使用-e選項排除這些模塊沒有任何效果,並且使用-i會生成空的調用圖。我也試過cProfile,但它只繪製了主線程。如何防止pycallgraph進入標準庫函數?

如何讓pycallgraph只顯示我的代碼中的調用?目前混亂的結果是沒用的。

編輯:我正在使用0.5.1,通過easy_install提供。運行pycallgraph ./cursesclient.py輸出:a messy call graph。正如你所看到的,pycallgraph顯示了模塊內部的json,re,編碼,套接字和線程。 Re和編碼都不會直接在我的代碼中調用,而是直接通過json和套接字調用。

+0

無論如何,謝謝指向我pycallgraph。 –

+0

你使用什麼版本?在0.5.1中,我只能使用我的函數調用'pycallgraph mycode.py',但選項'-s'忽略了一些模塊,比如'functools' – adray

回答

5

pycallgraph有一個未公開的stop_trace()方法,您可以使用它來排除部分代碼。類似於

import pycallgraph 
import mycode 
import stuff_i_dont_want_to_see 

pycallgraph.start_trace() 
#Initializations 

pycallgraph.stop_trace() 
stuff_i_dont_want_to_see() 
pycallgraph.start_trace() 

mycode.things() 
pycallgraph.make_dot_graph('cleaner_graph.png') 

這就是你所追求的嗎?

source

+2

鍵入的結果非常多,但我想要的卻很麻煩所有標準庫調用以避免繪製和分析它們;特別是因爲根據pycallgraph的命令行幫助,它不應該默認顯示它們。但是,由於已經差不多一個月了,我會在沒有更好的選擇的情況下接受你的答案。 – andyn

10

Pycallgraph提供過濾功能,過濾掉任何模塊,類或函數,你想從調用圖中排除。在啓動跟蹤之前下面的函數應定義,並傳遞給pycallgraph

def filtercalls(call_stack, modul, clas, func, full): 
    mod_ignore = ['shutil','scipy.optimize','re','os','sys','json'] 
    func_ignore = ['CustomFunctionName','pdbcall'] 
    clas_ignore = ['pdb'] 
    return modul not in mod_ignore and func not in func_ignore and clas not in clas_ignore 

的pycallgraph跟蹤開始是

pycallgraph.start_trace(filter_func=filtercalls) 

這樣,任何一個模塊,類或函數你提供過濾器將被刪除。請注意,標準庫中很多時候只提供模塊名稱是不夠的。因此,在mod_ignore中包含numpy仍然會導致numpy.core被包含在內。

+3

應該可以說是正確的答案,因爲它可以完成OP所要求的任務,例如,如果不使用「正確的」答案來消除自己的Thread實例,限制線程也是不可能的 – CrackerJack9