如何基于Dropbox-Uploader的monitor触发Python后续处理逻辑?
解决Dropbox文件夹监控触发后续Python逻辑的问题
方法一:用subprocess实时捕获监控输出,触发单次逻辑
直接用Python的subprocess.Popen启动监控命令,实时读取输出,检测到变更时执行后续操作,同时加标记避免重复触发。
import subprocess import time # 标记是否已处理过当前变更,防止重复执行 has_processed = False # 启动监控进程,捕获输出 monitor_proc = subprocess.Popen( ["dropbox_uploader.sh", "monitor", "/Lancaster"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) while True: line = monitor_proc.stdout.readline() if not line: break # 进程结束时退出循环 # 根据实际监控输出调整判断条件,比如输出含"changed"就判定为变更 if "changed" in line.lower() and not has_processed: has_processed = True # 执行后续逻辑:下载Updater.txt # 这里替换成你调用dropbox_uploader下载文件的命令/函数 subprocess.run(["dropbox_uploader.sh", "download", "/Lancaster/Updater.txt", "./Updater.txt"]) # 解析文件并调用处理函数 with open("./Updater.txt", "r") as f: content = f.read() Searching_By_Problem_Name(content) # 监控回到 idle 状态时,重置标记,等待下一次变更 elif "idle" in line.lower(): has_processed = False time.sleep(0.1) # 退出时终止监控进程 monitor_proc.terminate()
方法二:后台运行监控,轮询日志触发逻辑
把监控命令的输出重定向到日志文件,Python脚本轮询日志的新增内容,检测到变更时执行操作。
- 先在后台启动监控:
nohup dropbox_uploader.sh monitor /Lancaster > dropbox_monitor.log 2>&1 &
- Python轮询逻辑:
import time import os # 记录上次读取的日志大小,避免重复处理 last_log_size = 0 log_file = "dropbox_monitor.log" while True: if os.path.exists(log_file): current_size = os.path.getsize(log_file) if current_size > last_log_size: # 读取新增的日志内容 with open(log_file, "r") as f: f.seek(last_log_size) new_lines = f.read() if "changed" in new_lines.lower(): # 下载并处理文件 subprocess.run(["dropbox_uploader.sh", "download", "/Lancaster/Updater.txt", "./Updater.txt"]) with open("./Updater.txt", "r") as uf: Searching_By_Problem_Name(uf.read()) last_log_size = current_size time.sleep(3) # 每3秒轮询一次,可按需调整间隔
核心注意事项
- 避免重复执行:通过状态标记或日志偏移量,确保每次文件夹变更只触发一次后续逻辑,不会因为监控输出的重复行反复下载处理。
- 匹配实际输出:要根据
dropbox_uploader.sh monitor的真实输出内容调整判断条件(比如实际输出可能是"Directory /Lancaster modified",就对应匹配这个字符串)。 - 进程清理:用subprocess启动监控时,记得在脚本退出时终止进程;后台运行的监控进程,不用时可以用
kill命令清理。
内容的提问来源于stack exchange,提问作者GrifferScott
相关产品推荐
相关产品推荐

