You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求Python脚本运行时自动打印执行语句的可用解决方案

自动打印Python脚本执行的语句

嘿,我完全懂你的需求——不想手动给每一行代码加打印,却能让脚本自动输出它正在执行的那些具体语句,比如print("xxx")或者myfun()这类调用,对吧?手动加print确实太繁琐了,我给你一个直接能用的方案,基于Python的跟踪机制实现,不用改你原有代码太多。

直接可用的实现代码

import sys
import inspect
import re

def trace_executed_statements(frame, event, arg):
    # 只关注代码行执行的事件
    if event != 'line':
        return trace_executed_statements
    
    try:
        # 获取当前执行的代码行,去除首尾空格
        current_line = inspect.getframeinfo(frame).code_context[0].strip()
        
        # 定义正则,匹配print语句和函数调用(比如func())
        target_pattern = re.compile(r'(print\s*\(.*\))|(\w+\s*\(.*\))')
        
        # 只打印我们关心的语句,同时跳过跟踪自身的代码
        if target_pattern.match(current_line) and 'trace_executed_statements' not in current_line:
            print(f"[正在执行] {current_line}")
    except IndexError:
        # 动态生成的代码可能拿不到行信息,直接跳过
        pass
    
    return trace_executed_statements

# 启用跟踪
sys.settrace(trace_executed_statements)

# ------------------- 以下是你的业务代码 -------------------
print("测试print语句")

def my_custom_func():
    print("函数内部的print")
    temp = 3 * 5
    return temp

my_custom_func()
another_func()  # 假设这是你定义的另一个函数

代码说明

  • 跟踪逻辑:通过sys.settrace()注册一个跟踪函数,Python解释器会在每一行代码执行时触发这个函数。
  • 精准过滤:用正则表达式匹配print(...)和函数调用(比如myfun()),只打印你关心的语句,避免输出无关的赋值、导入等代码。
  • 避免自循环:特意跳过了跟踪函数自身的代码,防止无限打印跟踪逻辑本身。

自定义调整

如果你想扩大/缩小跟踪范围,只需要修改正则表达式target_pattern即可:

  • 比如要跟踪赋值语句,可以加上(\w+\s*=.*)
  • 如果只想跟踪特定函数,比如myfun(),可以把正则改成re.compile(r'(print\s*\(.*\))|(myfun\s*\(.*\))')

注意事项

  • 这个方案适合调试场景,会轻微影响脚本运行效率,生产环境不建议启用。
  • 对于动态生成的代码(比如用exec()执行的字符串代码),可能无法获取到源代码行,会自动跳过。
  • 嵌套函数、类方法内的语句也能被正常跟踪到。

内容的提问来源于stack exchange,提问作者user1424739

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:58:38