2012-10-31 19 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