注意:我是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)
我已经尝试过:
但是它对我不起作用:/我认为以上链接和我的情况之间的区别在于,我需要直接更改事件安排运行的时间。
我尝试添加以下代码,但仍然无法正常工作:
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阶段,最有可能在完成之前进行更改。
问题是如何重新定义计划时间,其余代码仅用于上下文。
答案 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)