在特定时间触发 python 脚本

Fire a python script at a specific time

我正在尝试在 python 中构建一种工作系统。这包含一个前端网页,允许人们在 x 时间安排工作 运行。 PHP 然后将包含它的 运行 时间的作业写入数据库。然后我在我的服务器上有一个 python cronjob 运行ning,它将每 30 分钟检查一次以查看是否有新工作。如果有,它将触发一个计划脚本以在触发前倒计时到 event/job 的确切分钟。

可在以下位置找到我用于调度程序的脚本:https://github.com/dbader/schedule。这似乎是一个非常好的脚本,我在另一个 SO 页面上找到了它。但是 - 通过 PIP 安装后,该模块似乎无法正常工作?

正在尝试 运行 调度脚本 - Python 引擎崩溃于: schedule.today.at('14:38').do(工作) 我只需要 运行 一个可以重复使用的一次性调度程序来同时安排多个作业。这些工作下周同一时间重复的可能性很小,因此我喜欢计划模块。

这是我根据 GIT:

上的一些片段构建的示例代码
import schedule
import time

def job():
    # Do some work ...

    print("Hello World")
    return schedule.CancelJob

#schedule.every(10).seconds.do(job)
schedule.today.at('14:38').do(job)

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

如果其他人遇到同样的问题 - 或者对如何实现此问题有其他想法 - 请告诉我!!

查看 master 分支上的源代码,schedule 没有公开一个名为 today 的属性。如果您看到一个使用此类属性的示例,那么问题似乎是您使用的是已从中删除该属性的库版本。

不幸的是,如果您的主要要求是能够安排一次性任务,那么这个库看起来不太适合。

编辑:

没有 today 属性,因此 FAQ 中提到的片段不会直接起作用,但您应该能够挽救它的基本思想:

def job_that_executes_once():
    # Do some work ...
    return schedule.CancelJob

schedule.every().day().at('14:38').do(job_that_executes_once)

编辑 2:

可能有用:"only do this job once" 装饰器。

from functools import wraps

import schedule


def do_once(func):
    @wraps(func)
    def wrapped(*args, **kwargs):
        func(*args, **kwargs)
        return schedule.CancelJob
    return wrapped

@do_once
def some_one_off_job():
    # Do some work
    # No need to return schedule.CancelJob
    print 5

@do_once
def some_other_one_off_job():
    # hooray, decorators!
    pass

schedule.every().day().at('14:38').do(some_one_off_job)
schedule.every().day().at('14:38').do(some_other_one_off_job)