Python程序执行过程中如何输出正在运行的文件路径与对应行号?
实现输出自动附带执行文件名、行号的方案
核心设计原则
- 全程不修改原业务代码的任何类、方法、循环逻辑,不干预程序原有执行流程
- 100%保留Python原生异常报告的完整逻辑,KeyError等报错的栈信息、错误类型、提示内容和原生输出完全一致
实现原理
- 通过Python内置的运行时跟踪钩子,实时抓取当前执行帧对应的文件名、代码行号,存储为全局可访问的上下文信息
- 对标准输出流、标准错误流做轻量封装,在每次写入输出内容时自动拼接位置前缀,不破坏原有流的flush、关闭、异常抛出逻辑
可直接运行的实现代码
import sys import io # 全局记录当前执行代码的位置信息 exec_context = {"file_name": "", "line_num": 0} def trace_exec_position(frame, event, arg): # 每执行到新的代码行就更新位置缓存 exec_context["file_name"] = frame.f_code.co_filename.split("/")[-1] exec_context["line_num"] = frame.f_lineno return trace_exec_position class PrefixStream(io.TextIOWrapper): def __init__(self, target_stream): # 直接复用原流的底层缓冲,不重复创建IO对象 super().__init__(target_stream.buffer, encoding=target_stream.encoding) def write(self, content): # 跳过空行,避免冗余前缀 if not content.strip(): super().write(content) return # 按要求格式拼接前缀 prefix = f"{exec_context['file_name']} line{exec_context['line_num']}: " super().write(f"{prefix}{content}") if __name__ == "__main__": # 启动执行位置跟踪 sys.settrace(trace_exec_position) # 替换原有的标准输出、错误流 sys.stdout = PrefixStream(sys.stdout) sys.stderr = PrefixStream(sys.stderr) # 下方替换为原程序的入口调用 # 例:import legacy_program; legacy_program.run()
效果说明
- 所有正常终端输出都会按照「文件名 行号: 输出内容」的格式逐行展示,顺序完全匹配代码实际执行流程
- 如果需要展示文件完整路径,只需将跟踪钩子中获取文件名的逻辑改为直接读取
frame.f_code.co_filename即可,无需修改其他逻辑 - 触发KeyError等异常时,原生栈回溯的每一行输出都会自动对应到触发位置的文件名、行号,完全不破坏原有报错的可追溯性
- 跟踪逻辑仅做位置信息缓存,不介入代码逻辑判断,不会造成原程序运行结果偏移
内容的提问来源于stack exchange,提问作者hanugm
相关产品推荐
相关产品推荐

