Je recherche une bibliothèque en Python qui fournira at
et cron
aimera les fonctionnalités.
J'aimerais tout à fait avoir une solution Python pure, plutôt que de compter sur des outils installés sur la boîte; de cette façon, je fonctionne sur des machines sans cron.
Pour ceux qui ne connaissent pas cron
: vous pouvez planifier des tâches basées sur une expression comme:
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 syntaxe de l'expression du temps cron est moins importante, mais j'aimerais avoir quelque chose avec ce genre de flexibilité.
S'il n'y a pas quelque chose qui le fasse pour moi, les suggestions pour les blocs de construction pour faire quelque chose comme ça seraient reçues avec gratitude.
Edit Je ne suis pas intéressé par le lancement de processus, juste des "jobs" également écrits en Python - des fonctions python. Par nécessité, je pense que ce serait un fil différent, mais pas dans un processus différent.
À cette fin, je recherche l'expressivité de l'expression du temps cron, mais en Python.
Cron existe depuis des années, mais j'essaie d'être aussi portable que possible. Je ne peux pas compter sur sa présence.
la source
Réponses:
Si vous recherchez un horaire de paiement léger :
Divulgation : je suis l'auteur de cette bibliothèque.
la source
schedule
. Ça a bien marché pour moi. Ce serait encore plus agréable s'il avait une syntaxe similaire à cron et des décorateurs pris en charge (voir crython mais n'utilisez pas cette bibliothèque car cela ne fonctionne pas; la planification ne semble pas bien écrite).do()
fonction transfère les arguments supplémentaires que vous lui passez à la fonction de travail: schedule.readthedocs.io/en/stable/api.html#schedule.Job.do Par exemple, vous pouvez le faire :schedule.every().hour.do(job, param1, param2)
Pas besoin d'utiliser un lambda. J'espère que cela aide :)Vous pouvez simplement utiliser la syntaxe de passage d'argument Python normale pour spécifier votre crontab. Par exemple, supposons que nous définissions une classe d'événements comme ci-dessous:
(Remarque: non testé à fond)
Ensuite, votre CronTab peut être spécifié dans la syntaxe python normale comme:
De cette façon, vous obtenez toute la puissance de la mécanique d'argument de Python (mélange d'arguments positionnels et de mots clés, et pouvez utiliser des noms symboliques pour des noms de semaines et de mois)
La classe CronTab serait définie comme dormant simplement par incréments d'une minute et appelant check () à chaque événement. (Il faut probablement se méfier de certaines subtilités avec l'heure d'été / les fuseaux horaires). Voici une mise en œuvre rapide:
Quelques choses à noter: les jours de semaine / mois de Python sont indexés zéro (contrairement à cron), et cette plage exclut le dernier élément, donc la syntaxe comme "1-5" devient plage (0,5) - c'est-à-dire [0,1,2, 3,4]. Si vous préférez la syntaxe cron, l'analyse ne devrait cependant pas être trop difficile.
la source
pip install anything
:)peut-être que cela ne s'est produit qu'après que la question a été posée; Je pensais que je viens de le mentionner pour des raisons d'exhaustivité: https://apscheduler.readthedocs.org/en/latest/
la source
Une chose que j'ai vue dans mes recherches est le
sched
module de python qui pourrait être le genre de chose que vous recherchez.la source
"... Module Crontab pour lire et écrire des fichiers crontab et accéder au système cron automatiquement et simplement en utilisant une API directe. ..."
http://pypi.python.org/pypi/python-crontab
et aussi APScheduler, un package python. Déjà écrit et débogué.
http://packages.python.org/APScheduler/cronschedule.html
la source
Plus ou moins les mêmes que ci-dessus mais en même temps que gevent :)
la source
Aucune des solutions répertoriées ne tente même d'analyser une chaîne de planification cron complexe. Alors, voici ma version, en utilisant croniter . Contenu de base:
Routines d'assistance:
la source
elif
? Atm J'utilise un programme comme en"* * * * *"
ajoutant ensuitetime.sleep
plus de 1 minute dans le "Faites votre truc périodique"if
, mais je vois toujours le truc dans cette instruction if. Quand cela prend plus d'une minute, je vois juste la boucle while sauter cette exécution de boucle manquante.J'ai modifié le script.
Facile à utiliser:
Essayez de démarrer la tâche dans la première seconde d'une minute.
Code sur Github
la source
J'ai un correctif mineur pour la méthode d'exécution de classe CronTab suggérée par Brian .
Le chronométrage a été interrompu d'une seconde, ce qui a entraîné une boucle dure d'une seconde à la fin de chaque minute.
la source
Il n'y a pas de méthode "pure python" pour cela car un autre processus devrait lancer python pour exécuter votre solution. Chaque plateforme aura une ou vingt façons différentes de lancer des processus et de suivre leur progression. Sur les plates-formes Unix, cron est l'ancien standard. Sur Mac OS X, il existe également launchd, qui combine un lancement de type cron avec une fonctionnalité de surveillance qui peut maintenir votre processus en vie si c'est ce que vous voulez. Une fois que python est en cours d'exécution, vous pouvez utiliser le module sched pour planifier des tâches.
la source
Je sais qu'il y a beaucoup de réponses, mais une autre solution pourrait être d'aller avec des décorateurs . Ceci est un exemple pour répéter une fonction tous les jours à une heure précise. La bonne idée d'utiliser cette méthode est que vous n'avez qu'à ajouter le sucre syntaxique à la fonction que vous souhaitez planifier:
Et le décorateur ressemblera à:
la source
La solution de Brian fonctionne assez bien. Cependant, comme d'autres l'ont souligné, il y a un bug subtil dans le code d'exécution. De plus, je l'ai trouvé trop compliqué pour les besoins.
Voici mon alternative plus simple et fonctionnelle pour le code d'exécution au cas où quelqu'un en aurait besoin:
la source
Une autre solution triviale serait:
Et la classe aqcron.At est:
la source
Si vous recherchez un planificateur distribué, vous pouvez consulter https://github.com/sherinkurian/mani - il a besoin de redis mais ce n'est peut-être pas ce que vous recherchez. (notez que je suis l'auteur) ceci a été construit pour assurer la tolérance aux pannes en faisant fonctionner l'horloge sur plusieurs nœuds.
la source
Je ne sais pas si quelque chose comme ça existe déjà. Il serait facile d'écrire le vôtre avec des modules d'heure, de date et / ou de calendrier, voir http://docs.python.org/library/time.html
La seule préoccupation pour une solution python est que vos besoins d'emploi d'être toujours en cours d' exécution et peut - être automatiquement « ressuscités » après un redémarrage, quelque chose pour lequel vous avez besoin de compter sur des solutions dépendantes du système.
la source
Vous pouvez consulter les [1] Crons [2] de PiCloud, mais notez que vos travaux ne s'exécuteront pas sur votre propre machine. C'est aussi un service que vous devrez payer si vous utilisez plus de 20 heures de temps de calcul par mois.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
la source
Méthode de Crontab sur le serveur.
Nom de fichier Python hello.py
Étape 1: créer un fichier sh et donner le nom à s.sh
Étape 2: Ouvrez l'éditeur Crontab
Étape 3: ajouter une heure de planification
Utiliser la mise en forme Crontab
Ce cron s'exécutera «à la minute 2».
la source
J'aime la façon dont le paquet pycron résout ce problème.
la source