Python 计划作业从每个工作日开始,每小时运行一次



我目前有一个示例代码定义为:

import schedule
import time
def job(t):
    print ("I'm working...", t)
    return
schedule.every().day.at("01:00").do(job,'It is 01:00')
while True:
    schedule.run_pending()
    time.sleep(60) # wait one minute

但是,我希望在工作日的上午 9 点至下午 4 点每小时运行一次代码。 即周一到周五的每一天,我想在上午 9 点、上午 10 点、...、下午 3 点、下午 4 点运行代码。

阅读文档以了解schedule似乎我可以在两个指定时间之间单独运行代码Monday Friday但不仅仅是工作日。

另外,以下time.sleep(60)不应该使代码永久运行吗?

它对我有用的唯一方法是:

import schedule
import datetime
import time
nowtime = str(datetime.datetime.now())
def job(t):
    print("I'm working...", str(datetime.datetime.now()), t)
for i in ["06:00", "09:00", "12:00", "15:00", "18:00"]:
    schedule.every().monday.at(i).do(job, i)
    schedule.every().tuesday.at(i).do(job, i)
    schedule.every().wednesday.at(i).do(job, i)
    schedule.every().thursday.at(i).do(job, i)
    schedule.every().friday.at(i).do(job, i)
while True:
    schedule.run_pending()
    time.sleep(30)
def weekday_job(x, t=None):
    week = datetime.today().weekday()
    if t is not None and week < 5:
        schedule.every().day.at(t).do(x)
weekday_job(main, '01:00')
weekday_job(main, '02:00')
while True:
    schedule.run_pending()
    time.sleep(60)

您可以使用库 APScheduler。例如:

from apscheduler.schedulers.blocking import BlockingScheduler
def job_function():
    print("Hello World")
sched = BlockingScheduler()
# Runs from Monday to Friday at 5:30 (am) until
sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30)
sched.start()

时间表一开始看起来很有趣,但最终如果您需要更多内容,则没有真正的帮助。

尝试使用碧羹

import pycron
import time
def job():
    timenow = time.localtime()
    print("I'm working...", str( time.strftime("%H:%M", timenow) )) 
while True:
#                     |----------------- on minute 0, so every full hour
#                     |  |--------------- on hours 9 till 16
#                     |  |   | |-------- every day in month and every month
#                     V  V   V V  v------ on weekdays Monday till Friday
    if pycron.is_now('0 9-16 * * mon-fri'):
        job()
time.sleep(60)

更好的方法:

schedule.every().monday.at("09:00").do(
   lambda: schedule.every().hour.until("16:00").do(job))

您可以为每个工作日制作 5 个,也可以以更通用的方式进行:

days = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
# Make a generic "weekday" option for schedule
def weekday(self, day):
    self.start_day = day
    return self.weeks
schedule.Job.weekday = weekday
# For each non-weekend day
for i in range(5):
    schedule.every().weekday(days[i]).at("09:00").do(
        lambda: schedule.every().hour.until("16:00").do(job))

如果您愿意,也可以这样做:

for i in range(5):
    # When the workday starts, schedule a job to run every hour and tag it
    schedule.every().weekday(days[i]).at("09:00").do(
        lambda: schedule.every().hour.do(job).tag(days[i]))
    # When the workday ends, cancel the job using the tag
    schedule.every().weekday(days[(i+1) % len(days)]).at("16:00").do(
        lambda: schedule.clear(days[i]))

使用风险自负,我没有测试一人。

最新更新