15

我正在使用命令行中的pycallgraph来分析和绘制一个相对简单的程序的调用图。但是,即使我不使用 -s 命令行选项,生成的图像也包含标准库(线程、json、套接字)的内部结构。使用 -e 选项排除这些模块无效,使用 -i 会导致空调用图。我也尝试过 cProfile,但它只绘制主线程。

如何使 pycallgraph 仅在我的代码中显示调用?目前乱七八糟的结果是没用的。

编辑:我使用的是 0.5.1,可通过 easy_install 获得。运行 pycallgraph ./cursesclient.py 输出凌乱的调用图:如您所见,pycallgraph 显示模块 json、re、编码、套接字和线程的内部结构。在我的代码中甚至从未直接调用 Re 和编码,而是分别通过 json 和 socket 调用。

4

2 回答 2

13

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)

这样,您在 filtercalls 中提供的任何模块、类或函数都将被删除。请注意,在标准库中很多时候只提供模块名称是不够的。因此,在 mod_ignore 中包含 numpy 仍将导致包含 numpy.core

于 2013-08-14T15:25:06.737 回答
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')

这就是你所追求的吗?

资源

于 2012-11-24T15:29:55.730 回答