如何跟踪Python脚本执行状态?求可行实践方案
Python脚本执行跟踪的实用方案
一、装饰器方案(最推荐)
用装饰器封装跟踪逻辑,能轻松捕获执行时长、成功状态,还能复用在多个函数/脚本上。
示例代码:
import time from functools import wraps def track_execution(func): @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() status = 0 try: result = func(*args, **kwargs) except Exception as e: status = 1 # 可选:记录异常信息 print(f"执行出错: {str(e)}") raise # 不需要中断脚本就去掉这行 finally: end_time = time.time() duration = end_time - start_time print(f"脚本执行信息: 开始时间={start_time:.2f}, 结束时间={end_time:.2f}, 状态={status}, 时长={duration:.2f}s") # 可将信息写入日志文件或数据库持久化 return result return wrapper # 使用方式:给要跟踪的脚本主函数加装饰器 @track_execution def main(): # 你的脚本业务逻辑 print("脚本运行中...") # 模拟错误:raise ValueError("测试异常") if __name__ == "__main__": main()
- 优势:代码侵入性极低,只需给主函数加装饰器即可自动跟踪所有状态;支持异常捕获,准确标记失败状态。
- 注意:如果脚本没有主函数,可把所有逻辑放到被装饰的函数中。
二、上下文管理器方案
适合需要在特定代码块内跟踪的场景,语法直观。
示例代码:
import time class ExecutionTracker: def __enter__(self): self.start_time = time.time() return self def __exit__(self, exc_type, exc_val, exc_tb): self.end_time = time.time() self.status = 0 if exc_type is None else 1 duration = self.end_time - self.start_time print(f"执行记录: 开始时间={self.start_time:.2f}, 结束时间={self.end_time:.2f}, 状态={self.status}, 时长={duration:.2f}s") # 可选:exc_type不为None时记录详细错误信息 return False # 返回True会抑制异常,按需调整 # 使用方式 with ExecutionTracker() as tracker: # 你的脚本逻辑 print("脚本执行中...") # 模拟错误:raise TypeError("测试错误")
- 优势:通过
with语句明确界定跟踪范围,适合局部代码块的监控;同样能捕获异常状态。
三、脚本入口包裹方案
不想用装饰器或上下文管理器时,直接在脚本最外层包裹逻辑,适合简单脚本快速实现。
示例代码:
import time start_time = time.time() status = 0 try: # 你的整个脚本逻辑写在这里 print("脚本运行中...") # 模拟错误:raise Exception("测试异常") except Exception as e: status = 1 print(f"执行失败: {str(e)}") finally: end_time = time.time() duration = end_time - start_time print(f"执行结果: 开始时间={start_time:.2f}, 结束时间={end_time:.2f}, 状态={status}, 时长={duration:.2f}s") # 可将结果写入日志,比如: # with open("execution_log.txt", "a") as f: # f.write(f"{start_time},{end_time},{status},{duration}\n")
- 优势:无需额外封装,代码直接明了,适合小型脚本快速落地跟踪需求。
四、日志模块结合方案
把跟踪信息标准化写入日志,方便后续分析。可结合上面任意方案,将打印替换为日志输出。
示例(结合装饰器):
import time import logging from functools import wraps # 配置日志 logging.basicConfig(filename='script_tracking.log', level=logging.INFO, format='%(asctime)s - %(message)s') def track_with_log(func): @wraps(func) def wrapper(*args, **kwargs): start_time = time.time() status = 0 try: func(*args, **kwargs) except Exception as e: status = 1 logging.error(f"脚本执行失败: {str(e)}") raise finally: end_time = time.time() duration = end_time - start_time logging.info(f"脚本执行记录: 开始时间={start_time:.2f}, 结束时间={end_time:.2f}, 状态={status}, 时长={duration:.2f}s") return wrapper @track_with_log def main(): print("脚本运行中...") if __name__ == "__main__": main()
- 优势:日志持久化存储,方便后续通过工具分析执行情况,比如统计成功率、平均执行时长等。
内容的提问来源于stack exchange,提问作者python_007
相关产品推荐
相关产品推荐

