You need to enable JavaScript to run this app. Python程序执行过程中如何输出正在运行的文件路径与对应行号?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 00:36:03