web-dev-qa-db-fra.com

Python pour faire quelque chose à la même heure chaque jour

J'ai un long script python) que je veux faire à chaque heure du matin.

J'ai examiné le module sched et l'objet Timer mais je ne vois pas comment les utiliser pour y parvenir.

60
Paul McKenzie

Vous pouvez faire ça comme ça:

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

Ceci exécutera une fonction (par exemple, hello_world) le lendemain à 1 heure du matin.

EDIT:

Comme suggéré par @PaulMag, plus généralement, afin de déterminer si le jour du mois doit être réinitialisé en raison de la fin du mois, la définition de y dans ce contexte doit être la suivante:

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

Avec ce correctif, il est également nécessaire d’ajouter timedelta aux importations. Les autres lignes de code conservent la même chose. La solution complète, qui utilise également la fonction total_seconds (), est donc la suivante:

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

J'ai également passé pas mal de temps à lancer un simple programme Python à 01:00. Pour une raison quelconque, je n'ai pas pu obtenir cron pour le lancer et APScheduler semblait assez complexe pour quelque chose qui devrait être simple. Programmer ( https://pypi.python.org/pypi/schedule ) semblait à peu près correct.

Vous devrez installer leur bibliothèque Python:

pip install schedule

Ceci est modifié à partir de leur exemple de programme:

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

Vous devrez mettre votre propre fonction à la place du travail et l'exécuter avec Nohup, par exemple:

Nohup python2.7 MyScheduledProgram.py &

N'oubliez pas de le redémarrer si vous redémarrez.

148
user2099484

APScheduler pourrait être ce que vous recherchez.

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/

Vous pouvez simplement le faire planifier une autre exécution en l'intégrant dans la fonction que vous planifiez.

13
Paul Collingwood

J'avais besoin de quelque chose de similaire pour une tâche. C'est le code que j'ai écrit: Il calcule le jour suivant, modifie l'heure en fonction de ce qui est requis et trouve les secondes entre l'heure courante et la prochaine heure planifiée.

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