Python定时任务:让自动化脚本每天自己跑起来

📂 文章

自动化的最后一公里:定时执行

你写了一个很好的自动化脚本:能自动整理文件、自动发邮件、自动备份数据。但每天还是要手动去运行它。

这就差最后一步:让脚本自己按时跑。Python有两个方案:

方案一:schedule库——在Python代码内定时,简单直观。

方案二:系统任务计划——让操作系统定时启动Python脚本,更可靠。

方案一:用schedule库

import schedule
import time
from datetime import datetime

def job_morning():
    """每天早上9点的任务"""
    print(f"[{datetime.now()}] 执行早间任务...")
    # 比如:发送日报邮件
    # 比如:检查今日待处理文件

def job_afternoon():
    """每天下午3点的任务"""
    print(f"[{datetime.now()}] 执行午后任务...")
    # 比如:同步数据

def job_evening():
    """每天晚上10点的任务"""
    print(f"[{datetime.now()}] 执行晚间任务...")
    # 比如:备份当天数据

# 设置定时任务
schedule.every().day.at("09:00").do(job_morning)
schedule.every().day.at("15:00").do(job_afternoon)
schedule.every().day.at("22:00").do(job_evening)

# 每30分钟执行一次
schedule.every(30).minutes.do(lambda: print("心跳检测"))

# 每周一上午10点
schedule.every().monday.at("10:00").do(lambda: print("周报时间"))

print("定时任务已启动,按Ctrl+C停止")

# 保持运行
while True:
    schedule.run_pending()
    time.sleep(1)

实战:每日自动备份+清理

import schedule
import time
import os
import shutil
from datetime import datetime

def daily_backup_and_clean():
    """每日备份+清理过期文件"""
    print(f"[{datetime.now()}] 开始每日维护...")
    
    # 1. 备份工作文档
    source = "D:/工作文档"
    backup_base = "E:/自动备份"
    today = datetime.now().strftime("%Y%m%d")
    backup_dir = os.path.join(backup_base, today)
    
    if not os.path.exists(backup_dir):
        shutil.copytree(source, backup_dir)
        print(f"  ✓ 备份完成:{backup_dir}")
    else:
        print(f"  - 今日已备份")
    
    # 2. 清理30天前的临时文件
    temp_dir = "D:/工作文档/临时文件"
    if os.path.exists(temp_dir):
        cutoff = time.time() - (30 * 86400)
        cleaned = 0
        for f in os.listdir(temp_dir):
            fp = os.path.join(temp_dir, f)
            if os.path.isfile(fp) and os.path.getmtime(fp) < cutoff:
                os.remove(fp)
                cleaned += 1
        print(f"  ✓ 清理了 {cleaned} 个过期文件")
    
    # 3. 清理7天前的备份(只保留最近7天)
    for old_backup in os.listdir(backup_base):
        old_path = os.path.join(backup_base, old_backup)
        if os.path.isdir(old_path):
            days_old = (time.time() - os.path.getmtime(old_path)) / 86400
            if days_old > 7:
                shutil.rmtree(old_path)
                print(f"  ✓ 删除旧备份:{old_backup}")
    
    print(f"[{datetime.now()}] 维护完成")

# 每天凌晨2点执行
schedule.every().day.at("02:00").do(daily_backup_and_clean)

print("自动维护已启动")
while True:
    schedule.run_pending()
    time.sleep(60)  # 每分钟检查一次

方案二:Windows任务计划程序

schedule库需要Python进程一直运行。如果你想让电脑重启后也能自动执行,用Windows任务计划程序更可靠。

步骤:

1. 把你的Python脚本保存为.py文件,比如 D:/scripts/daily_task.py

2. 创建一个bat文件 D:/scripts/run_task.bat:

@echo off
cd /d D:\scripts
D:\Python39\python.exe daily_task.py >> log.txt 2>&1

3. 打开"任务计划程序"(搜索栏输入即可)

4. 创建基本任务 → 设置触发器(每天/每周/登录时)→ 操作选"启动程序" → 选择你的bat文件

5. 勾选"不管用户是否登录都要运行"

两种方案对比

schedule库:适合开发调试阶段,代码内控制时间逻辑,灵活但需要进程常驻。

任务计划程序:适合生产环境,系统级调度,开机自启,更稳定可靠。

建议:开发时用schedule,部署时用任务计划程序。

日志记录

import logging

# 配置日志
logging.basicConfig(
    filename="task_log.txt",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

def my_task():
    logging.info("任务开始")
    try:
        # 你的代码
        result = do_something()
        logging.info(f"任务完成,结果:{result}")
    except Exception as e:
        logging.error(f"任务失败:{e}")

# 这样每次执行都有日志记录,出问题可以追溯