求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
相关产品推荐
相关产品推荐

