如何限制Python trace追踪输出仅显示指定源文件的调用记录
指定源文件函数调用列表生成方案
不需要额外编写独立的过滤脚本处理原始trace输出,Python内置trace模块本身就支持筛选规则,直接配置即可拿到仅自身源码对应的调用记录:
- 命令行快速方案:使用
--ignore-dir参数排除所有非项目源码路径,直接过滤掉标准库、第三方依赖的调用记录,可直接运行如下命令:
python -m trace --trackcalls --ignore-dir=$(python -c "import sys, site; print(':'.join(sys.path[1:] + site.getsitepackages()))") main.py
该命令会自动获取当前Python环境的标准库、第三方包安装路径加入忽略列表,最终输出只会保留你当前工作目录下编写的源码调用记录。
- 精准自定义方案:如果需要仅追踪某几个特定源文件,可直接调用trace模块的API初始化追踪器,自定义匹配规则,不需要事后筛日志,示例代码如下:
import trace import sys import os # 配置需要追踪的目标文件绝对路径,示例为追踪main.py和同目录下的utils.py TARGET_FILES = {os.path.abspath("main.py"), os.path.abspath("utils.py")} def trace_filter(frame, event, arg): # 仅保留目标文件内的调用 return os.path.abspath(frame.f_code.co_filename) in TARGET_FILES # 初始化追踪器 tracer = trace.Trace( trace=0, count=0, callers=1, t=trace_filter ) # 运行主程序 tracer.run('exec(open("main.py").read())') # 输出按调用顺序排列的函数调用关系 call_records = tracer.results() call_records.write_results(show_missing=False, coverdir=None)
如果项目结构简单,第一种命令行方案就能满足文档编写时展示程序工作流的需求;如果需要更精细的筛选粒度,用第二种API方式自定义规则即可,效率远高于事后处理全量trace日志。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

