下面是我的trace_calls函数,用于获取调用图的json格式输出。
我的输出是{"callgraph": ["function_1", "function_2", "c", "function_2", "retjson", "dumps", "encode", "iterencode"]}
包括程序包的内部函数("retjson", "dumps", "encode", "iterencode"
),并且在挂接settrace之后被调用。
我想要的是将json作为返回{"callgraph": ["function_1", "function_2", "c", "function_2"]}
我已经尝试过的事情:-if event == 'return':
,但是它并没有帮助跳过带有return的函数。
原因是文档内容:
“返回”
一个函数(或其他代码块)即将返回。本地跟踪函数被调用; arg是将返回的值;如果事件是由引发异常引起的,则为None。跟踪函数的返回值将被忽略。
def retjson(x):
python2json = json.dumps({"callgraph": x})
return python2json
def trace_calls(frame, event, arg):
if event != ('call'):
return
co = frame.f_code
func_name = co.co_name
if func_name == ('write'):
# Ignore write() calls from print statements
return
func_line_no = frame.f_lineno
func_filename = co.co_filename
caller = frame.f_back
caller_line_no = caller.f_lineno
caller_filename = caller.f_code.co_filename
tree_list.append(func_name)
tree_line_list.append(caller_line_no)
x = json.dumps({"callgraph": tree_list})
y = json.dumps({"line_no": tree_line_list})
print ('Call to %s on line %s of %s from line %s of %s' % \
(func_name, func_line_no, func_filename,
caller_line_no, caller_filename))
return trace_calls
def function_2():
print ('in b()')
def function_1():
print ('in a()')
function_2()
c()
def c():
print ('in c()')
sys.settrace(trace_calls)
function_1()
function_2()
print(retjson(tree_list))