una tiempo tareas tarea script programar funcion ejemplo ejecutar desde consola cierto cada python python-3.x cron scheduled-tasks cron-task

tiempo - programar una tarea en python



ProgramaciĆ³n de Python Script para ejecutar cada hora con precisiĆ³n (6)

Antes de preguntar, Cron Jobs y el Programador de tareas serán mis últimas opciones, este script se usará en Windows y Linux y preferiría tener un método codificado para hacer esto que dejarlo al usuario final para que lo complete.

¿Hay una biblioteca para Python que pueda usar para programar tareas? Necesitaré ejecutar una función una vez por hora, sin embargo, con el tiempo si ejecuto un script una vez por hora y uso .sleep, "una vez por hora" se ejecutará en una parte diferente de la hora del día anterior debido a la demora inherente a la ejecución / ejecución de la secuencia de comandos y / o función.

¿Cuál es la mejor manera de programar una función para que se ejecute en una hora específica del día (más de una vez) sin usar un trabajo cron o programarlo con el Programador de tareas?

O si esto no es posible, me gustaría su aporte también.

El Programador AP se ajusta exactamente a mis necesidades.

Versión <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'')

fuera:

>Hello World >2014-03-28 09:44:00.016.492 >Hello World >2014-03-28 09:45:00.0.14110

Versión> 3.0

(De la respuesta de Animesh Pandey a continuación)

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


En la versión publicada por sunshinekitty llamada "Versión <3.0", es posible que deba especificar apscheduler 2.1.2. Accidentalmente tuve la versión 3 en mi instalación 2.7, así que fui:

pip uninstall apscheduler pip install apscheduler==2.1.2

Funcionó correctamente después de eso. Espero que ayude.


La biblioteca estándar de Python proporciona sched y threading para esta tarea. Pero esto significa que su script del planificador se ejecutará todo el tiempo en lugar de dejar su ejecución en el sistema operativo, que puede ser o no lo que usted desea.


Para apscheduler <3.0, consulte la respuesta de Unknown .

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

Actualizar:

documentation apscheduler .

Esto para apscheduler-3.3.1 en 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()


Para ejecutar algo cada 10 minutos después de la hora.

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)


Tal vez esto pueda ayudar: Programador avanzado de Python

Aquí hay un pequeño fragmento de código de su documentación:

from apscheduler.schedulers.blocking import BlockingScheduler def some_job(): print "Decorated job" scheduler = BlockingScheduler() scheduler.add_job(some_job, ''interval'', hours=1) scheduler.start()


Una opción es escribir un contenedor C / C ++ que ejecute el script python de forma regular. Su usuario final ejecutaría el ejecutable C / C ++, que seguiría ejecutándose en segundo plano, y ejecutaría periódicamente el script de python. Puede que esta no sea la mejor solución, y puede que no funcione si no conoces C / C ++ o si deseas conservar este 100% python. Pero parece ser el enfoque más fácil de usar, ya que las personas están acostumbradas a hacer clic en los archivos ejecutables. Todo esto supone que python está instalado en la computadora de su usuario final.

Otra opción es usar cron job / Task Scheduler pero ponerlo en el instalador como un script para que su usuario final no tenga que hacerlo.