背景:本地Windows系统指定目录下会有文件的修改新增,这些变化的文件需要定时的被上传到git仓库中,这样不需要每次变更手动上传了。
首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_etl目录下初始化了Git,并且正确配置了远程仓库)
import os
import subprocess
from datetime import datetime
import logging
# 设置日志
log_file = "E:\\edc_workspace\\data_edc_etl\\upload.log"
logging.basicConfig(filename=log_file, filemode='a', format='%(asctime)s - %(message)s', level=logging.INFO)
# 文件夹路径
folder_path = "E:\\edc_workspace\\data_edc_etl"
# 上次检查时间的文件路径
last_check_file = "E:\\edc_workspace\\data_edc_etl\\last_check.txt"
def get_last_check_time():
try:
with open(last_check_file, 'r') as f:
last_check_str = f.read()
return datetime.fromisoformat(last_check_str)
except Exception as e:
logging.error(f"Error reading last check time: {e}")
# 如果无法读取上次检查的时间,返回当前时间
return datetime.now()
def set_last_check_time():
now = datetime.now()
with open(last_check_file, 'w') as f:
f.write(now.isoformat())
def check_for_changes(folder_path, last_check):
has_changes = False
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
last_modified_time = datetime.fromtimestamp(os.path.getmtime(file_path))
if last_modified_time >= last_check:
logging.info(f"Detected change in file: {file_path}")
has_changes = True
return has_changes
def upload_to_git():
try:
os.chdir(folder_path) # Change directory to the repo
subprocess.run(["git", "add", "."], check=True) # Stage changes
subprocess.run(["git", "commit", "-m", "watchdog自动上传本地数据仓库文件"], check=True) # Commit changes
subprocess.run(["git", "push", "origin", "master"], check=True) # Push changes
logging.info("Changes pushed to git.")
except subprocess.CalledProcessError as e:
logging.error(f"Failed to upload to git: {e}")
if __name__ == "__main__":
last_check = get_last_check_time()
if check_for_changes(folder_path, last_check):
upload_to_git()
else:
logging.info("No changes detected.")
set_last_check_time()
文件手动测试OK
接下来配置Windows的定时任务:
1、打开【任务计划程序】
打开任务计划程序的方式有很多,打开控制面板,点击系统和安全,可以看到任务计划程序
2、打开【创建任务】窗口
创建一个文件夹用来存放你的定时任务文件,选择现有的目录也可以,但是下次你可能就很难找到新建的任务,选择新建的文件夹,右键点击“创建任务”,打开任务创建窗口。
3、创建任务一一常规
任务名称为必填项,其他可以根据实际需要选填
4、创建任务一一触发器
在"触发器"tab界面,点击"新建",打开"新建触发器"窗口
下拉列表中有多种开始任务的策略,选择不同的选项,下方的填写项也会有变化。我这里就选择常用的 “按预定计划”;
其他配置根据实际需求选择配置。
5、创建任务一一操作
在"操作"tab界面,点击"新建",打开"新建操作"窗口
程序或脚本:
方式1:直接填写 python,前提是 python 解释器 路径已配置到了 Path 环境变量;
方式2:填写 python 解释器的 绝对路径,如D:\Chen\Python\Python3.12.4\python.exe
添加参数:
填写脚本路径及脚本需要的参数
1)如果"起始于"项未填写,则脚本路径需要绝对路径;
2)如果"起始于"项填写了,则脚本路径可以填绝对路径,也可以填相对路径(相对于"起始于"给的路径);
3)脚本如果需要参数,在脚本名称后空格,然后跟传参值即可,多个参数值之间也用空格隔开。
起始于:
程序或脚本打开时的工作路径
1)如果未填写,脚本需要给出绝对路径,且脚本代码内如果有使用文件或目录的地方,也需要使用绝对路径,否则会找不到对应文件或目录;
2)如果填写了,脚本可以使用相对路径,且脚本代码内如果有使用文件或目录的地方,也可以使用相对路径;
6、创建任务一一条件
创建任务执行的条件,这里的条件与触发器是且的关系,即 触发器和条件同时满足时才会执行任务
这里有一点需要注意,如果你的脚本需要联网才能正常运行,需要勾选"只有在以下网络连接可用时才启动",并且选择对应的网络
7、创建任务一一设置
设置影响任务行为的其他设置
8、完成任务创建
设置完后,最后点击"确认",完成任务创建。
任务创建完成后,可以查看任务配置信息,如上图所示。
如果想要修改任务,可以点击右侧的"属性",打开任务编辑窗口进行相关修改。
任务会在设定的时间去执行,在"上次运行结果"可以看到最近一次任务执行的状态,会有对应的状态码及提示信息。
验证:
查看日志:
查看远程仓库: