[ Python ] 使用 Python 动态解析如下格式的值班表文件并定点提醒如何实现

2022-10-24 14:46:55 +08:00
 proxytoworld

需求:目前有一个值班,分为 3 班,计划做成如下文件

2022-10-24,a,b,c #a b c 代表早中晚班的人名
2022-10-21,c,y,d
2022-10-22,c,d,ra
2022-10-23,c,d,rs
2022-10-24,c,d,rs
2022-10-25,c,d,rs

使用 python 解析文件,定点调用 api 发送明天的值班人,因为一次只能出两个礼拜的值班表,所以值班表文件每两个周要变动一次,计划在值班表修改的时候能够重新读取值班表,让程序可以通过新值班表定点发送。

目前的想法是起一个线程,用 watchdog 监控文件修改,在 on_modified 触发时调用解析函数 Reminder.callback()重新解析配置文件,使得新值班表进入变量内

在 callback 中读取配置文件并解析,通过 datetime.today()获取当前时间,如果当前时间减去设置好的时间 +6h +12h +18h 则调用Reminder.send()发送消息

但目前因为要持续获取当前时间,设置了死循环,导致文件修改时触发回调没用,死循环所在的线程还在运行。 有什么好办法可以解决吗

class MonitorHandler(FileSystemEventHandler):
    def __init__(self) -> None:
        super().__init__()
    ...
    def on_modified(self, event):
        print("on_modified", event.src_path)
        # print(event.src_path[-len(Config.monitoring_file):])
        if Config.monitoring_file == event.src_path[-len(Config.monitoring_file):]:
            print("reload")
            self.reload_file()
   ...
    def reload_file(self):
        Reminder.callback()

Reminder 类:


    def callback():
        with open(Config.monitoring_directory+'/'+Config.monitoring_file, 'r') as f:
            lines = f.readlines()
            dates = []
            dutys = []
            for line in lines:
                l = line.strip('\n').split(',')
                dates.append(l[0])
                dutys.append(l[1:])
            # print(dutys)
            # print()
            while True:
                today = datetime.today()
                zeroToday = today - timedelta(
                    hours=today.hour, minutes=today.minute, seconds=today.second, microseconds=today.microsecond)
                tomorrow = today + timedelta(days=1)

                if str(tomorrow)[:10] in dates:
                    # 取出明天的值班人,和 index
                    index = dates.index(str(tomorrow)[:10])
                    time_index = 0
                    now = datetime.today()
                    while(str(now)[:10] == str(today)[:10]):
                        now = datetime.today()
                        gap = now - zeroToday
                        gap_list = str(gap).split(':')
                        if int(gap_list[0]) == Config.notify_time[time_index]:
                            print("yes")
                            time_index += 1
                        else:
                            print("gap:", gap_list[0],
                                  str(Config.notify_time[time_index]))

                        time.sleep(1)

                else:
                    # Reminder.send("暂无" + str(tomorrow)[:10])
                    break
426 次点击
所在节点    问与答
2 条回复
geeglo
2022-10-24 15:11:00 +08:00
一个 crontab 就搞定的事情,搞这么复杂干啥。
proxytoworld
2022-10-24 15:34:08 +08:00
@geeglo 有道理。。是我想多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/889380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX