Python脚本每天在同一时间做某事

Pau*_*zie 65 python scheduler python-2.7

我有一个长期运行的python脚本,我想在每天早上01:00做一些事情.

我一直在看sched模块和Timer对象,但我看不出如何使用它们来实现这一点.

小智 153

我花了很多时间也想在01:00启动一个简单的Python程序.出于某种原因,我无法让cron启动它,而APScheduler似乎相当复杂,应该很简单.时间表(https://pypi.python.org/pypi/schedule)似乎是正确的.

您必须安装他们的Python库:

pip install schedule
Run Code Online (Sandbox Code Playgroud)

这是从他们的示例程序修改:

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
Run Code Online (Sandbox Code Playgroud)

您需要将自己的功能放在工作位置并使用nohup运行,例如:

nohup python2.7 MyScheduledProgram.py &
Run Code Online (Sandbox Code Playgroud)

如果重新启动,请不要忘记再次启动它.

  • 任何人在将来看到这个主题,希望他们明白这是生产代码的正确解决方案而不是被接受的解决方案. (37认同)
  • 警告:如果您同时运行多个应用程序(例如 Flask 应用程序),则此调度程序将阻塞。如果您想并行运行进程或作为守护进程在后台运行,您仍然需要使用诸如 APScheduler 之类的东西。所以我认为这并不总是正确的解决方案。 (4认同)
  • 这个库在 Windows 上也很好用! (3认同)

sis*_*aty 49

你可以这样做:

from datetime import datetime
from threading import Timer

x=datetime.today()
y=x.replace(day=x.day+1, hour=1, minute=0, second=0, microsecond=0)
delta_t=y-x

secs=delta_t.seconds+1

def hello_world():
    print "hello world"
    #...

t = Timer(secs, hello_world)
t.start()
Run Code Online (Sandbox Code Playgroud)

这将在第二天的下午1点执行一个函数(例如hello_world).

  • 修复日期逻辑:x = datetime.today()y =(x + timedelta(days = 1)).replace(小时= 2,分钟= 0,秒= 0)delta_t = y - x (7认同)
  • 每天早上我需要这样做...... (5认同)
  • 回调可以在第一次调用时启动另一个`Timer`。 (2认同)
  • 不错的解决方案。只是一个问题,你为什么要在行`secs = delta_t.seconds+1` 上添加 1 秒? (2认同)
  • @Sandi 好问题!这是因为 x=datetime.today(),x 可以有 0-999999 微秒(除了其他值);然后,使用 xy 的秒数将给出在假定日期之前 0-999999 微秒开始的结果;+1 函数将在假定日期后的 0-999999 微秒处开始。它类似于秒的 ceil() 舍入。但是,如果需要更高的精度,可以将“1”更改为“0.000001*delta_t.microseconds”。 (2认同)
  • 当您到达月底并给出“ValueError: day is out of range for Month”时,此问题会中断,因为它会盲目地增加日期而不考虑月份,因此最终会得到 day=32。相反,执行 `x.replace(day=x.day, hour=1, 分钟=0, Second=0, microsecond=0) + datetime.timedelta(days=1)`。然后 datetime 理解添加一个逻辑日,并根据需要增加月份和年份,这样它可以一直持续到年份超过 9000。信用:/sf/answers/226834051/ (2认同)

Pau*_*ood 13

APScheduler可能就是你所追求的.

from datetime import date
from apscheduler.scheduler import Scheduler

# Start the scheduler
sched = Scheduler()
sched.start()

# Define the function that is to be executed
def my_job(text):
    print text

# The job will be executed on November 6th, 2009
exec_date = date(2009, 11, 6)

# Store the job in a variable in case we want to cancel it
job = sched.add_date_job(my_job, exec_date, ['text'])

# The job will be executed on November 6th, 2009 at 16:30:05
job = sched.add_date_job(my_job, datetime(2009, 11, 6, 16, 30, 5), ['text'])
Run Code Online (Sandbox Code Playgroud)

https://apscheduler.readthedocs.io/en/latest/

您可以通过将其构建到您正在安排的功能中来安排另一次运行.


小智 7

我需要类似的任务.这是我写的代码:它计算第二天并将时间更改为所需的时间,并查找currentTime和下一个计划时间之间的秒数.

import datetime as dt

def my_job():
    print "hello world"
nextDay = dt.datetime.now() + dt.timedelta(days=1)
dateString = nextDay.strftime('%d-%m-%Y') + " 01-00-00"
newDate = nextDay.strptime(dateString,'%d-%m-%Y %H-%M-%S')
delay = (newDate - dt.datetime.now()).total_seconds()
Timer(delay,my_job,()).start()
Run Code Online (Sandbox Code Playgroud)