Подтвердить что ты не робот

Python script делать что-то в одно и то же время каждый день

У меня есть длинный python script, который я хочу делать в 01:00 каждое утро.

Я смотрел модуль sched и на Timer, но я не могу понять, как их использовать для достижения этой цели.

4b9b3361

Ответ 1

Вы можете сделать это так:

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()

Это выполнит функцию (например, hello_world) на следующий день в 1:00.

РЕДАКТИРОВАТЬ:

Как предлагает @PaulMag, в более общем смысле, чтобы определить, должен ли день месяца быть сброшен из-за наступления конца месяца, определение y в этом контексте должно быть следующим:

y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)

С этим исправлением также необходимо добавить timedelta к импорту. Другие строки кода поддерживают то же самое. Поэтому полное решение, использующее также функцию total_seconds():

from datetime import datetime, timedelta
from threading import Timer

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

secs=delta_t.total_seconds()

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

t = Timer(secs, hello_world)
t.start()

Ответ 2

Я потратил немало времени, также глядя на запуск простой программы Python в 01:00. По какой-то причине я не мог заставить cron запустить его, и APScheduler казался довольно сложным для чего-то, что должно быть простым. Расписание (https://pypi.python.org/pypi/schedule) казалось правильным.

Вам нужно будет установить их библиотеку Python:

pip install schedule

Это изменено из их примерной программы:

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

Вам нужно будет поместить свою собственную функцию вместо задания и запустить ее без nohup, например:

nohup python2.7 MyScheduledProgram.py &

Не забудьте запустить его снова, если вы перезагрузитесь.

Ответ 3

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'])

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

Вы можете просто заставить его запланировать другой запуск, создав его в функции, которую вы планируете.

Ответ 4

Мне нужно что-то подобное для задачи. Это код, который я написал: Он вычисляет следующий день и изменяет время на все, что требуется, и находит секунды между текущим временем и следующим запланированным временем.

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()