为 Python 代码构建调用树

Building a call tree for a Python code

我得到了一个 Python 代码,以及它导入的模块。我想构建一棵树,指示哪个函数调用其他函数。我该怎么做?

你应该从程序的主要功能开始,在第一层 link 从主要调用的所有功能这将提供一个起点,然后你可以 link 所有它下面的函数。

您可以使用 python 标准库中的 ast(抽象语法树)模块

# foo.py
def func(x):
    print('hello')

正在使用 ast.parse:

解析文件
import ast
tree = ast.parse(open('foo.py').read())
print(ast.dump(tree))  # dumps the whole tree

# get the function from the tree body (i.e. from the file's content)
func = tree.body[0]

# get the function argument names
arguments = [a.arg for a in func.args.args]
print('the functions is: %s(%s)' % (func.name, ', '.join(arguments)))

输出:

"Module(body=[FunctionDef(name='func', args=arguments(args=[arg(arg='x', annotation=None)], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='hello')], keywords=[]))], decorator_list=[], returns=None)])"

the functions is: func(x)