Build a Call graph in python including modules and functions?

PythonFunctionStaticModuleCall Graph

Python Problem Overview


I have a bunch of scripts to perform a task. And I really need to know the call graph of the project because it is very confusing. I am not able to execute the code because it needs extra HW and SW to do so. However, I need to understand the logic behind it. So, I need to know if there is a tool (which do not require any python file execution) that can build a call graph using the modules instead of the trace or python parser. I have such tools for C but not for python.
Thank you.

Python Solutions


Solution 1 - Python

The best tool I've found is called pyan, and was originally written by Edmund Horner, improved by him, and then given colorization and other features by Juha Jeronen. That version has useful commandline options:

Usage: pyan.py FILENAME... [--dot|--tgf]

Analyse one or more Python source files and generate an approximate call graph
of the modules, classes and functions within them.

Options:
  -h, --help           show this help message and exit
  --dot                output in GraphViz dot format
  --tgf                output in Trivial Graph Format
  -v, --verbose        verbose output
  -d, --defines        add edges for 'defines' relationships [default]
  -n, --no-defines     do not add edges for 'defines' relationships
  -u, --uses           add edges for 'uses' relationships [default]
  -N, --no-uses        do not add edges for 'uses' relationships
  -c, --colored        color nodes according to namespace [dot only]
  -g, --grouped        group nodes (create subgraphs) according to namespace
                       [dot only]
  -e, --nested-groups  create nested groups (subgraphs) for nested namespaces
                       (implies -g) [dot only]

Here's the result of running pyan.py --dot -c -e pyan.py | fdp -Tpng:

pyan's output on itself

Edmund Horner's original code is now best found in his github repository, and somebody has also made a repository with both versions, from where you can download Juha Jeronen's version. I've made a clean version combining their contributions into my own repository just for pyan, since both repositories have lots of other software.

Solution 2 - Python

You might want to check out pycallgraph:

pycallgraph

Also in this link a more manual approach is described:

generating-call-graphs-for-understanding-and-refactoring-python-code

Solution 3 - Python

In short, no such tool exists. Python is far too dynamic of a language to be able to generate a call graph without executing the code.

Here's some code which clearly demonstrates some of the very dynamic features of python:

class my_obj(object):
    def __init__(self, item):
        self.item = item
    def item_to_power(self, power):
        return self.item ** power

def strange_power_call(obj):
    to_call = "item_to_power"
    return getattr(obj, to_call)(4)

a = eval("my" + "_obj" + "(12)")
b = strange_power_call(a)

Note that we're using eval to create an instance of my_obj and also using getattr to call one of its methods. These are both methods that would make it extremely difficult to create a static call graph for python. Additionally, there are all sorts of difficult to analyze ways of importing modules.

I think your best bet is going to be to sit down with the code base and a pad of paper, and start taking notes by hand. This will have the dual benefit of making you more familiar with the code base, and will not be easily tricked by difficult to parse scenarios.

Solution 4 - Python

SourceTrail will help you here. https://www.sourcetrail.com/

Sourcetrail is a free and open-source cross-platform source explorer that helps you get productive on unfamiliar source code. Supports C, C++, Java and Python

https://github.com/CoatiSoftware/Sourcetrail

enter image description here

Here is a link to the documentation

https://www.sourcetrail.com/documentation/

Please note that Python support is relatively new, so please don't expect it to work perfectly yet.

Solution 5 - Python

You should check out PyCG, a peer reviewed Python call graph generator that we have created that can handle most of Python's features including higher-order functions, classes, generators and more.

Solution 6 - Python

the working version of pyan3 i found is 1.1.1 (pip install pyan3==1.1.1) and its documentation is here

Solution 7 - Python

I was recently (2021) looking for such a tool, and found code2flow which seems to be actively maintained.

Solution 8 - Python

I also write a little tool at: https://github.com/zw-normal/pycallgraph. The concept of code is simple to both understand and use, but it only provides limited information which another IDE is also needed to get better understanding.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJohnnyDHView Question on Stackoverflow
Solution 1 - PythonDavid FraserView Answer on Stackoverflow
Solution 2 - PythonvkontoriView Answer on Stackoverflow
Solution 3 - PythonWilduckView Answer on Stackoverflow
Solution 4 - PythoncodeslordView Answer on Stackoverflow
Solution 5 - PythonvitsalisView Answer on Stackoverflow
Solution 6 - Pythonitny gradView Answer on Stackoverflow
Solution 7 - PythonedemaineView Answer on Stackoverflow
Solution 8 - PythonWei ZhengView Answer on Stackoverflow