Search code examples
python-3.xpycallgraph

How do I remove an entire call tree from pycallgraph with a filter


I want to see what's happening with a specific operation in a python3 package I've been working on. I use pycallgraph and it looks great. But I can't figure out how to remove an entire tree of calls from the output.

I made a quick script make_call_graphs.py:

import doms.client.schedule as sched
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from pycallgraph import Config
from pycallgraph import GlobbingFilter

config = Config()
config.trace_filter = GlobbingFilter(exclude=[
    '_find_and_load',
    '_find_and_load.*', # Tried a few similar variations
    '_handle_fromlist',
    '_handle_fromlist.*',
])

with PyCallGraph(output=GraphvizOutput(output_file='schedule_hourly_call_graph.png'), config=config):
    sched.hourly()

Before I started using the GlobbingFilter, _find_and_load was at the top of the tree outside of my doms library call stack. It seems that the filter only removes the top level block, but every subsequent call remains in the output. (See BEFORE and AFTER below)

Obviously I can read the result and copy every single call I don't want to see into the filter, but that is silly. What can I do to remove that whole chunk of stuff outside my doms box? Is there a RecursiveFilter or something I could use?

BEFORE: enter image description here AFTER: enter image description here


Solution

  • The solution was much easier than I originally thought and right in front of me: the include kwarg given to the GlobbingFilter.

    config.trace_filter = GlobbingFilter(include=['__main__', 'doms.*'])