Programmer le Script Python pour exécuter chaque heure avec précision
Avant de me demander, Cron Jobs et Planificateur de Tâches sera ma dernière option, ce script sera utilisé à travers Windows et Linux et je préférerais avoir une méthode codée pour le faire plutôt que de laisser à l'utilisateur final le soin de le remplir.
y a-t-il une bibliothèque pour Python que je puisse utiliser pour programmer les tâches? Je vais avoir besoin d'exécuter une fonction une fois par heure, cependant, au fil du temps si je lance un script une fois par heure et utiliser .dormir, "une fois toutes les heures" va courir à une partie différente de la l'heure de la journée précédente en raison du retard inhérent à l'exécution/l'exécution du script ou de la fonction.
qu'est-Ce que le manière de programmer une fonction à exécuter à un moment précis de la journée (plus d'une fois) sans utiliser un travail Cron ou le programmer avec un planificateur de tâches?
Ou si cela n'est pas possible, j'aimerais avoir votre entrée.
un planificateur D'horaires adapté à mes besoins exactement.
Version < 3.0
import datetime
import time
from apscheduler.scheduler import Scheduler
# Start the scheduler
sched = Scheduler()
sched.daemonic = False
sched.start()
def job_function():
print("Hello World")
print(datetime.datetime.now())
time.sleep(20)
# Schedules job_function to be run once each minute
sched.add_cron_job(job_function, minute='0-59')
:
>Hello World
>2014-03-28 09:44:00.016.492
>Hello World
>2014-03-28 09:45:00.0.14110
Version > 3.0
(à Partir de Animesh Pandey la réponse ci-dessous)
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched.configure(options_from_ini_file)
sched.start()
6 réponses
Peut-être cela peut vous aider: Avancé Python Planificateur
voici un petit morceau de code de leur documentation:
from apscheduler.schedulers.blocking import BlockingScheduler
def some_job():
print "Decorated job"
scheduler = BlockingScheduler()
scheduler.add_job(some_job, 'interval', hours=1)
scheduler.start()
exécuter quelque chose toutes les 10 minutes après l'heure.
from datetime import datetime, timedelta
while 1:
print 'Run something..'
dt = datetime.now() + timedelta(hours=1)
dt = dt.replace(minute=10)
while datetime.now() < dt:
time.sleep(1)
apscheduler
< 3.0, reportez-vous à réponse de L'inconnu.
apscheduler
> 3,0
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
@sched.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched.configure(options_from_ini_file)
sched.start()
mise à Jour:
apscheduler
documentation.
apscheduler-3.3.1
Python 3.6.2
.
"""
Following configurations are set for the scheduler:
- a MongoDBJobStore named “mongo”
- an SQLAlchemyJobStore named “default” (using SQLite)
- a ThreadPoolExecutor named “default”, with a worker count of 20
- a ProcessPoolExecutor named “processpool”, with a worker count of 5
- UTC as the scheduler’s timezone
- coalescing turned off for new jobs by default
- a default maximum instance limit of 3 for new jobs
"""
from pytz import utc
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ProcessPoolExecutor
"""
Method 1:
"""
jobstores = {
'mongo': {'type': 'mongodb'},
'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
'default': {'type': 'threadpool', 'max_workers': 20},
'processpool': ProcessPoolExecutor(max_workers=5)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
"""
Method 2 (ini format):
"""
gconfig = {
'apscheduler.jobstores.mongo': {
'type': 'mongodb'
},
'apscheduler.jobstores.default': {
'type': 'sqlalchemy',
'url': 'sqlite:///jobs.sqlite'
},
'apscheduler.executors.default': {
'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
'max_workers': '20'
},
'apscheduler.executors.processpool': {
'type': 'processpool',
'max_workers': '5'
},
'apscheduler.job_defaults.coalesce': 'false',
'apscheduler.job_defaults.max_instances': '3',
'apscheduler.timezone': 'UTC',
}
sched_method1 = BlockingScheduler() # uses overrides from Method1
sched_method2 = BlockingScheduler() # uses same overrides from Method2 but in an ini format
@sched_method1.scheduled_job('interval', seconds=10)
def timed_job():
print('This job is run every 10 seconds.')
@sched_method2.scheduled_job('cron', day_of_week='mon-fri', hour=10)
def scheduled_job():
print('This job is run every weekday at 10am.')
sched_method1.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
sched_method1.start()
sched_method2.configure(gconfig=gconfig)
sched_method2.start()
sur la version Postée par sunshinekitty appelée "Version < 3.0", vous pouvez avoir besoin de spécifier apscheduler 2.1.2 . J'ai accidentellement eu la version 3 sur mon installation 2.7, donc j'ai fait:
pip uninstall apscheduler
pip install apscheduler==2.1.2
cela a fonctionné correctement après cela. Espérons que cela aide.
une option est d'écrire un wrapper C/C++ qui exécute le script python sur une base régulière. Votre utilisateur final lancerait l'exécutable C / C++, qui resterait en arrière-plan, et exécuterait périodiquement le script python. Ce n'est peut-être pas la meilleure solution, et peut ne pas fonctionner si vous ne connaissez pas C/C++ ou si vous voulez garder ce 100% python. Mais cela semble être l'approche la plus conviviale, puisque les gens sont habitués à cliquer sur les exécutables. Tout cela suppose que python est installé sur votre ordinateur de l'utilisateur final.
une autre option consiste à utiliser cron job/Task Scheduler mais de le mettre dans l'installateur comme un script pour que votre utilisateur final n'ait pas à le faire.