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()
39
demandé sur sunshinekitty 2014-03-28 18:05:37

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()
41
répondu Unknown 2016-05-18 05:22:17

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)
18
répondu Shane Davies 2016-02-29 06:52:09

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.1Python 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()
15
répondu Animesh Pandey 2017-09-27 17:40:57

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.

1
répondu Arkham Angel 2016-08-29 16:57:12

la bibliothèque standard Python fournit sched et enfilage pour cette tâche. Mais cela signifie que votre script scheduler aura fonctionné tout le temps au lieu de laisser son exécution au système D'exploitation, ce qui peut ou non être ce que vous voulez.

0
répondu aepsil0n 2014-03-28 14:18:56

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.

0
répondu ubadub 2014-03-28 14:22:44