构建Python代码的调用树

时间:2017-08-27 17:23:25

标签: python function call-graph

我已经获得了Python代码以及它导入的模块。我想构建一个树,指示哪个函数调用其他函数。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用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)