如何防止pycallgraph进入标准库函数?

16
我正在使用pycallgraph命令行工具对一个相对简单的程序进行剖析和绘制调用图。然而,生成的图片包括标准库(线程、json、套接字)的内部结构,尽管我没有使用-s命令选项。使用-e选项排除这些模块没有效果,并且使用-i会导致空白的调用图。我还试过cProfile,但它只绘制主线程。
如何让pycallgraph只显示我的代码中的调用?当前混乱的结果毫无用处。
编辑: 我正在使用0.5.1版本,可以通过easy_install获得。执行命令“pycallgraph ./cursesclient.py”会输出这个:a messy call graph。你可以看到,pycallgraph显示了模块json、re、encodings、socket和threading的内部结构。其中,re和encodings甚至从未直接在我的代码中被调用,而是通过json和socket间接调用的。

无论如何,感谢您指引我使用pycallgraph。 - Jonas Schäfer
你使用的是哪个版本?在0.5.1中,我可以只调用“pycallgraph mycode.py”来创建仅包含我的函数的图形,但选项“-s”会忽略一些模块,如“functools”。 - adray
2个回答

14

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
应该是正确答案,因为它实现了提问者所要求的功能。例如,限制线程可能需要消除自己的线程实例,而使用“正确”的答案则可以避免这种情况。 - CrackerJack9

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

Is that what you're after?

source


5
打这些基本上实现了我的目的,但为了避免对标准库函数进行图形化和分析,需要包装所有标准库调用,这很繁琐;尤其是因为根据pycallgraph的命令行帮助文档,它默认不会对它们进行图形化处理。然而,由于已经过去了将近一个月,如果没有更好的替代方案,我将接受您的答案。 - andyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接