(Python计划)基于csv文件更改计划的事件运行的时间

时间:2020-02-03 11:23:21

标签: python csv schedule

注意:我是SO的新手,所以对任何错误表示歉意。之前,我已经在Python中完成了几个项目。

程序

基本上,该程序所做的是基于.csv文件中存储的预定义时间表将某些特定时间通知用户。时间每天都在变化(这带来了我稍后讨论的问题)。 csv文件如下所示:

日期,日期,栏1,日出,栏3,栏4等

3,星期一,值1,07:54,值3,值4

在此示例中,我将在程序的整个演练中使用Sunrise。

我有一个名为 get_today_times()的函数,该函数可用于读取csv并返回名为time的列表:

def get_today_times():
  #code goes here
  return times

然后有另一个函数可以从上述函数获取时间:

def get_sunrise():
  times = get_today_times():
  sunrise_time = times[3]

  final_string = "Sunrise is at" + sunrise_time

  return sunrise_time, final_string

然后将上述功能调用到设置功能中:

def setup():
   sunrise_time, sunrise_string = get_sunrise()
   schedule_list = [sunrise_time, other variables following the same flow]
   output_list = [sunrise_string, other variables following the same flow] 

   return schedule_list, output_list

然后使用Webhook将数据发送到不一致:

def sunrise_discord():
   notify_discord(final_string)
   #The notify_discord function sends it to a discord server using a webhook

上述所有内容都使用计划https://pypi.org/project/schedule/)进行了安排:

if __name__ == "__main__":

   schedule_list, output_list = setup()

   schedule.every().day.at(schedule_list[0]).do(sunrise_discord)

   while True:
      schedule.run_pending()
      time.sleep(1)

问题

据我了解,代码从if __name__的开始一直运行到while循环不断运行,因此这意味着发送不和谐消息的时间每天都保持不变,并导致消息,例如:

(在07:54发送)日出时间是08:13

计划也不允许计划的函数返回诸如以下的值:

#DOES NOT WORK
schedule_list, output_list = schedule.every().day.at("00:00").do(setup)

我已经尝试过:

Python return value from scheduled event

但是它对我不起作用:/我认为以上链接和我的情况之间的区别在于,我需要直接更改事件安排运行的时间。

我尝试添加以下代码,但仍然无法正常工作:

while True:
        schedule.run_pending()
        time.sleep(1)

        if time.localtime().tm_hour == 00:
            if time.localtime().tm_min == 00:
                schedule_list, output_list = setup()

以上代码段应在午夜重新运行 setup()函数,然后重新分配schedule_list,并因此分配发送不和谐消息的时间,但这也不起作用:(

我考虑过安排整个python程序每天在特定时间运行。一旦所有计划的事件都发生了,请终止该进程/结束该程序,然后在第二天重新启动该程序。我还没有对此做任何研究,只是在我脑海中。我认为,只要该程序在第一天就可以正常运行,它就可以工作。

任何帮助/想法或其他意见将不胜感激:)

谢谢

请注意:

我的代码可能不是最好的,但是每天发送21条消息,我发现这种编码方式对我来说是最简单的方法。它仍处于Alpha 1阶段,最有可能在完成之前进行更改。

问题是如何重新定义计划时间,其余代码仅用于上下文。

1 个答案:

答案 0 :(得分:0)

可以扩展计划Job和Scheduler类。

这是一个如何在日出/日落时重新安排任务的例子

import datetime
from astral import LocationInfo
from astral.sun import sun
from schedule import Scheduler as _Scheduler
from schedule import Job as _Job


def job(message="Task"):
    print("I'm working on:", message)


class Job(_Job):
    city = LocationInfo("London", "England", "Europe/London", 51.5, -0.116)
    last_sunrise = None
    last_sunset = None

    def __init__(self, interval, scheduler):
        super().__init__(interval, scheduler)

    def at_sunrise(self):
        s = sun(self.city.observer, date=self.next_run)
        self.last_sunrise = s["sunrise"]
        return self.at(self.last_sunrise.strftime("%H:%M:%S"))

    def at_sunset(self):
        s = sun(self.city.observer, date=self.next_run)
        self.last_sunset = s["sunset"]
        return self.at(self.last_sunset.strftime("%H:%M:%S"))

    def rescedule_astro(self):

       if self.last_sunset:
           self.at_sunset()

       if self.last_sunrise:
           self.at_sunrise()

    def _schedule_next_run(self):
        super()._schedule_next_run()
        self.rescedule_astro()
        
        
class Scheduler(_Scheduler):
    def __init__(self):
        super().__init__()

    def every(self, interval=1):
       """ 
       Schedule a new periodic job.
       :param interval: A quantity of a certain time unit
       :return: An unconfigured :class:`Job <Job>`
       """
       job = Job(interval, self)
       return job


schedule = Scheduler()
schedule.every().friday.at_sunrise().do(job, message="Friday Sunrise")
schedule.every().day.at_sunset().do(job, message="Everyday Sunset")

print(schedule.jobs)
print(schedule.run_all())
print(schedule.jobs)
相关问题