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+O 和 CTRL+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 应用? [关闭]
如何过滤 EventLog 以每天获取一个日志 - PowerShell