Python:如何自动化脚本以每天在特定时间运行?

Posted

技术标签:

【中文标题】Python:如何自动化脚本以每天在特定时间运行?【英文标题】:Python: How to automate script to run every day at specific time? 【发布时间】:2017-09-25 21:35:18 【问题描述】:

目前,我有一个 python 脚本,它只会在到达指定的日期/时间后启动,除非我重新指定日期/时间,否则永远不会再次运行:

import datetime, time

start_time = datetime.datetime(2017, 4, 27, 19, 0, 0)

while(True):
    dtn = datetime.datetime.now()

    if dtn >= start_time:
       # Runs the main code once it hits the start_time

但是我怎样才能让它每天只在指定的时间运行代码呢?

提前谢谢你,一定会支持/接受答案

【问题讨论】:

为什么不是cronjob (linux) 或Task Scheduler (windows)? @PedroLobito 使用 Mac。您介意显示为答案,以便我也可以投票/接受答案吗? 答案已发布,GL! 【参考方案1】:

cronjob 是完成这项工作的正确工具。 要在每天 12:00 执行的 mac 上创建 job,请打开终端并输入:

env EDITOR=nano crontab -e
0 12 * * *  /full/path/to/python /full/path/to/script.py

CTRL+OCTRL+X 保存并退出。


注意事项:

1 - job 按以下格式指定:

2 - 要查看您的活动 crontab 作业列表,请使用以下命令:

crontab -l

提示:

在工作日凌晨 1 点执行:

0 1 * * 1-5 /full/path/to/python /full/path/to/script.py

每 10 分钟执行一次:

*/10 * * * * /full/path/to/python /full/path/to/script.py

日志输出到文件:

*/10 * * * * /full/path/to/python /full/path/to/script.py >> /var/log/script_output.log 2>&1

注意:

crontab.guru 是一个了解 cronjobs 的好网站

【讨论】:

如果我将 Python 添加到我的 PATH 变量中,我真的需要我的 python 完整路径还是只需要 python 如果已经在PATH上就不需要python完整路径了,我只是为新用户玩安全。【参考方案2】:

一旦您确定当前时间已超过开始时间,请使用 datetime.timedelta 对象将开始时间增加所需的时间间隔。

import datetime
import time

next_start = datetime.datetime(2017, 4, 27, 19, 0, 0)
while True:
    dtn = datetime.datetime.now()

    if dtn >= next_start:
        next_start += datetime.timedelta(1)  # 1 day
        # do what needs to be done

    time.sleep(AN_APPROPRIATE_TIME)

【讨论】:

您介意解释time.sleep() 的原因吗?顺便谢谢你的回复! 在您再次致电now() 之前,这只是一个延迟。一般来说,如果dtn >= next_start 是假的,那么一毫秒后它仍然是假的。 AN_APPROPRIATE_TIME 的一个不错的值是 (next_start - datetime.datetime.now()).seconds,也就是说,在 next_time 之前休眠多少秒。【参考方案3】:

使用 Python 模块 apscheduler 可能是一种选择。

from datetime import datetime
import time
import os

from apscheduler.schedulers.background import BackgroundScheduler


def tick():
    print('Tick! The time is: %s' % datetime.now())


if __name__ == '__main__':
    scheduler = BackgroundScheduler()
    scheduler.add_job(tick, 'interval', seconds=3)
    scheduler.start()
    print('Press Ctrl+0 to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        # This is here to simulate application activity (which keeps the main thread alive).
        while True:
            time.sleep(2)
    except (KeyboardInterrupt, SystemExit):
        # Not strictly necessary if daemonic mode is enabled but should be done if possible
        scheduler.shutdown()

【讨论】:

【参考方案4】:

你可以尝试使用python

Advanced Python Scheduler asyncio 协程在剩余时间内休眠。 this question 中有一个例子

在这两种情况下,python 解释器都必须运行,并且在等待正确的时间时可能会执行其他操作。

或者按照评论中的建议,您可以使用在您的操作系统上运行的其他服务来安排您的 python 脚本执行。

为什么不使用 cronjob (linux) 或任务计划程序 (windows)? ——佩德罗·洛比托

【讨论】:

以上是关于Python:如何自动化脚本以每天在特定时间运行?的主要内容,如果未能解决你的问题,请参考以下文章

如何杀死每天在特定时间以“单一应用模式”运行的 iOS 应用? [关闭]

Python 在每天定义的时间运行一段代码

如何过滤 EventLog 以每天获取一个日志 - PowerShell

SQL/Hive 查询以计算特定值每天的行数

从批处理文件运行python脚本时,如何自动将输入值传递给python“输入”函数

在特定的时间段内每天以每小时间隔运行本地通知