J'ai un script python qui tourne depuis longtemps et je veux faire quelque chose à 01:00 tous les matins.
J'ai regardé les calendrier et au module Minuterie mais je ne vois pas comment les utiliser pour y parvenir.
J'ai un script python qui tourne depuis longtemps et je veux faire quelque chose à 01:00 tous les matins.
J'ai regardé les calendrier et au module Minuterie mais je ne vois pas comment les utiliser pour y parvenir.
J'ai aussi passé pas mal de temps à chercher à lancer un simple programme Python à 01:00. Pour une raison quelconque, je n'ai pas réussi à cron pour le lancer et APScheduler semblait plutôt complexe pour quelque chose qui devrait être simple. Planification ( https://pypi.python.org/pypi/schedule ) semblait à peu près correct.
Vous devrez installer leur bibliothèque Python :
pip install schedule
Ce programme a été 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 de job et l'exécuter avec nohup, par exemple :
nohup python2.7 MyScheduledProgram.py &
N'oubliez pas de le relancer si vous redémarrez.
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 jour suivant à 1 heure du matin.
EDIT :
Comme suggéré par @PaulMag, plus généralement, afin de détecter si le jour du mois doit être réinitialisé en raison de l'atteinte de la fin du mois, la définition de y dans ce contexte sera la suivante :
y = x.replace(day=x.day, hour=1, minute=0, second=0, microsecond=0) + timedelta(days=1)
Avec cette correction, il est également nécessaire d'ajouter timedelta aux importations. Les autres lignes de code restent les mêmes. La solution complète, utilisant aussi la fonction total_seconds(), est donc :
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()
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 lui faire programmer une autre exécution en l'intégrant à la fonction que vous planifiez.
J'avais besoin de quelque chose de similaire pour une tâche. Voici le code que j'ai écrit : Il calcule le jour suivant et change l'heure à ce qui est nécessaire et trouve les secondes entre l'heure actuelle et la prochaine heure prévue.
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()
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.