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

如何跟踪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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:55:13