Estoy buscando una biblioteca en Python que proporcione at
y me cron
guste la funcionalidad.
Me gustaría tener una solución pura de Python, en lugar de confiar en las herramientas instaladas en la caja; De esta manera corro en máquinas sin cron.
Para aquellos que no están familiarizados con cron
: puede programar tareas basadas en una expresión como:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
La sintaxis de la expresión cron time es menos importante, pero me gustaría tener algo con este tipo de flexibilidad.
Si no hay algo que haga esto por mí de inmediato, cualquier sugerencia para que los bloques de construcción hagan algo como esto sería gratamente recibida.
Editar No estoy interesado en iniciar procesos, solo "trabajos" también escritos en Python - funciones de Python. Por necesidad, creo que este sería un hilo diferente, pero no en un proceso diferente.
Con este fin, estoy buscando la expresividad de la expresión de tiempo cron, pero en Python.
Cron ha existido durante años, pero estoy tratando de ser lo más portátil posible. No puedo confiar en su presencia.
fuente
Respuestas:
Si está buscando algo programa de pago ligero :
Divulgación : soy el autor de esa biblioteca.
fuente
schedule
. Funciono bien para mi. Sería aún mejor si tuviera una sintaxis cron y decoradores compatibles (vea crython pero no use esta biblioteca porque no funciona; la programación no parece estar bien escrita).do()
función reenvía argumentos adicionales que le pasa a la función de trabajo: schedule.readthedocs.io/en/stable/api.html#schedule.Job.do Por ejemplo, puede hacer esto :schedule.every().hour.do(job, param1, param2)
No es necesario usar una lambda. Espero que esto ayude :)Simplemente podría usar la sintaxis de paso de argumento normal de Python para especificar su crontab. Por ejemplo, supongamos que definimos una clase de evento de la siguiente manera:
(Nota: no probado exhaustivamente)
Entonces su CronTab se puede especificar en la sintaxis normal de Python como:
De esta manera, obtienes todo el poder de la mecánica de argumento de Python (mezclando argumentos posicionales y de palabras clave, y puedes usar nombres simbólicos para nombres de semanas y meses)
La clase CronTab se definiría simplemente como dormir en incrementos de minutos y llamar a check () en cada evento. (Probablemente hay algunas sutilezas con el horario de verano / zonas horarias a tener en cuenta). Aquí hay una implementación rápida:
Algunas cosas a tener en cuenta: los días de semana / meses de Python están indexados a cero (a diferencia de cron), y ese rango excluye el último elemento, por lo tanto, una sintaxis como "1-5" se convierte en rango (0,5), es decir, [0,1,2, 3,4]. Sin embargo, si prefiere la sintaxis cron, el análisis no debería ser demasiado difícil.
fuente
pip install anything
:)tal vez esto haya surgido solo después de que se hizo la pregunta; Pensé que solo lo mencionaba por completo: https://apscheduler.readthedocs.org/en/latest/
fuente
Una cosa que he visto en mis búsquedas es el
sched
módulo de Python, que podría ser el tipo de cosa que estás buscando.fuente
"... Módulo Crontab para leer y escribir archivos crontab y acceder al sistema cron automáticamente y simplemente usando una API directa ..."
http://pypi.python.org/pypi/python-crontab
y también APScheduler, un paquete de Python. Ya escrito y depurado.
http://packages.python.org/APScheduler/cronschedule.html
fuente
Más o menos igual que el anterior pero concurrente usando gevent :)
fuente
Ninguna de las soluciones enumeradas intenta siquiera analizar una cadena de programación cron compleja. Entonces, aquí está mi versión, usando croniter . Esencia básica:
Rutinas de ayuda:
fuente
elif
? Atm Estoy usando un horario como"* * * * *"
luego agregar algotime.sleep
más de 1 minuto en "Haz tu cosa periódica"if
, pero siempre veo las cosas en esa declaración if. Cuando se tarda más de 1 minuto, solo veo el ciclo while omitiendo la ejecución del ciclo faltante.He modificado el guión.
Fácil de usar:
Intenta comenzar la tarea en el primer segundo de un minuto.
Código en Github
fuente
Tengo una solución menor para el método de ejecución de clase CronTab sugerido por Brian .
El tiempo de espera se agotó en un segundo, lo que condujo a un bucle duro de un segundo al final de cada minuto.
fuente
No hay una forma de "pitón puro" para hacer esto porque algún otro proceso tendría que iniciar python para ejecutar su solución. Cada plataforma tendrá una o veinte formas diferentes de iniciar procesos y monitorear su progreso. En plataformas Unix, cron es el viejo estándar. En Mac OS X también hay launchd, que combina el lanzamiento cron-like con la funcionalidad de watchdog que puede mantener vivo su proceso si eso es lo que desea. Una vez que Python se está ejecutando, puede usar el módulo programado para programar tareas.
fuente
Sé que hay muchas respuestas, pero otra solución podría ser ir con decoradores . Este es un ejemplo para repetir una función todos los días a una hora específica. Lo mejor de usar esta manera es que solo necesita agregar el azúcar sintáctico a la función que desea programar:
Y el decorador se verá así:
fuente
La solución de Brian está funcionando bastante bien. Sin embargo, como otros han señalado, hay un error sutil en el código de ejecución. También me pareció demasiado complicado para las necesidades.
Aquí está mi alternativa más simple y funcional para el código de ejecución en caso de que alguien lo necesite:
fuente
Otra solución trivial sería:
Y la clase aqcron. Es:
fuente
Si está buscando un programador distribuido, puede consultar https://github.com/sherinkurian/mani ; sin embargo, necesita redis, por lo que podría no ser lo que está buscando. (tenga en cuenta que yo soy el autor) esto se creó para garantizar la tolerancia a fallos al ejecutar el reloj en más de un nodo.
fuente
No sé si ya existe algo así. Sería fácil escribir uno propio con módulos de hora, fecha y hora o calendario, consulte http://docs.python.org/library/time.html
La única preocupación de una solución pitón es que sus necesidades de trabajo para estar siempre corriente y eventualmente ser automáticamente "resucitados" después de un reinicio, algo para lo que hace necesario recurrir a soluciones que dependen del sistema.
fuente
Puede consultar los [1] Crons [2] de PiCloud, pero tenga en cuenta que sus trabajos no se ejecutarán en su propia máquina. También es un servicio que deberá pagar si usa más de 20 horas de tiempo de cómputo al mes.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
fuente
Método de Crontab en el servidor.
Nombre de archivo Python hello.py
Paso 1: crea un archivo sh, dé el nombre s.sh
Paso 2: Abra el Editor de Crontab
Paso 3: Agregar tiempo de programación
Usar formato de tabla de referencias
Este cron se ejecutará "en el minuto 2".
fuente
Me gusta cómo el paquete pycron resuelve este problema.
fuente