Comment puis-je obtenir un Cron comme planificateur en Python?
Je suis à la recherche d'une bibliothèque Python qui permettra de fournir de at
et cron
comme fonctionnalité.
Que j'aimerais avoir un pur Python solution, plutôt que de s'appuyer sur les outils installés sur la zone; de cette façon, je tourne sur des machines sans cron.
Pour ceux qui ne connaissent cron
: vous pouvez planifier des tâches basée 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.
Le cron du temps la syntaxe de l'expression est moins important, mais je voudrais avoir quelque chose avec ce genre de flexibilité.
Si il n'y a pas quelque chose qui fait cela pour moi-le-fort, toutes les suggestions pour les blocs de construction pour faire quelque chose qui serait reçu avec gratitude.
Modifier
Je ne suis pas intéressé dans le lancement de processus, juste "emplois" aussi écrit en Python - python fonctions. Par nécessité, je pense que ce serait un thread différent, mais pas dans un processus différent.
À cette fin, je suis à la recherche de l'expressivité de la cron temps d'expression, mais en Python.
Cron a été autour depuis des années, mais je vais essayer d'être aussi portable que possible. Je ne peut pas compter sur sa présence.
Upvoting à cette question, puisque ça semble être la plus ancienne des cinq questions similaires que j'ai trouvé. 🙂 J'ai fait en sorte que les autres sont marqués comme des dupes.
OriginalL'auteur jamesh | 2008-12-17
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la recherche de quelque chose de léger, la caisse l'annexe:
Divulgation: je suis l'auteur de la bibliothèque.
schedule
. Il a bien fonctionné pour moi. Il serait encore mieux si elle avait cron comme la syntaxe et les prises en charge des décorateurs (voir crython mais ne pas utiliser cette bibliothèque car il ne fonctionne pas; le calendrier ne semble pas être bien écrit).Est-il possible de passer un paramètre à l'emploi? J'aimerais faire quelque chose comme ceci: calendrier.tous les().heure.n'(job(myParam))
l'horaire.tous les().heure.faire(de travail) est-ce à exécuter chaque heure d'horloge? Comme 01:00, 02:00, 03:00, etc.? même si l'heure de départ n'est pas une heure?
supposons que ce code est dans scheduler.py. sera-ce le code de s'exécuter automatiquement ?
et @zen-skunkworx: Le
do()
fonction de transfère d'arguments supplémentaires, vous passez à la fonction de travail: calendrier.readthedocs.io/fr/stable/api.html#calendrier.Travail.n' Par exemple, vous pouvez faire ceci:schedule.every().hour.do(job, param1, param2)
Pas besoin d'utiliser une lambda. Espérons que cela aide 🙂OriginalL'auteur dbader
Vous pouvez simplement utiliser la normale Python argument en passant syntaxe pour spécifier votre crontab. Par exemple, supposons que nous définissons une classe d'Événements comme ci-dessous:
(Note: Pas testés)
Alors votre CronTab peut être spécifié dans la normale la syntaxe de python:
De cette façon, vous obtenez la pleine puissance de Python argument de la mécanique (mélange de positionnement de mots clés et de args, et peut utiliser des noms symboliques pour les noms des semaines et des mois)
La CronTab de classe doit être définie comme dormir simplement en incréments d'une minute, et en appelant check() sur chaque événement. (Il y a probablement quelques subtilités avec l'heure d'été /les fuseaux horaires à se méfier tout de même). Voici une mise en œuvre rapide:
Quelques choses à noter: Python jours de la semaine /mois sont à zéro, indexé (à la différence de cron), et que la gamme exclut le dernier élément, d'où la syntaxe comme "1-5" devient gamme(0,5) - ie [0,1,2,3,4]. Si vous préférez cron de la syntaxe, de l'analyse, il ne devrait pas être trop difficile cependant.
Bon j'ai ajouté les importations.
Je me demandais, pourquoi est-ce est privilégié par rapport à Kronos? Est sched que buggy (depuis kronos utilise sched)? Ou est-ce juste dépassé?
Merci brian, je utiliser votre solution en production, et il fonctionne très bien. Cependant, comme d'autres l'ont souligné, il y a un bug subtil dans votre exécuter du code. Aussi je l'ai trouvé trop compliqué pour les besoins.
C'est cool, mais ne peut toujours pas de support de barre oblique, pour l'exécution de chaque heure, min, etc...
OriginalL'auteur Brian
peut-être que c'est seulement après que la question a été posée; j'ai pensé que je viens de mentionner par souci d'exhaustivité: https://apscheduler.readthedocs.org/en/latest/
OriginalL'auteur ssc
Découvrez Céleri, ils ont des tâches périodiques comme cron.
Mise à jour lien cassé à la documentation en cours
C'est un peu sur-killer.
OriginalL'auteur Vishal
"... Crontab module pour la lecture et l'écriture de fichiers crontab et de l'accès au système de cron automatiquement et simplement à l'aide directe de l'API. ..."
http://pypi.python.org/pypi/python-crontab
et aussi APScheduler, un paquet python. Déjà écrit & débogué.
http://packages.python.org/APScheduler/cronschedule.html
OriginalL'auteur bootload
Une chose, dans mes recherches j'ai vu est le python
sched
module qui pourrait être le genre de chose que vous cherchez.commencez avec sched et d'ajouter des fonctionnalités. Vous avez la source.
oui, vous avez raison. Maintenant, je suis juste essayer de voir si je peux éviter d'inventer une roue carrée.
La source est avec vous,
sched
est très accessible.sched a maintenant enterabs() qui n'absolue de la planification.
OriginalL'auteur Sean
Plus ou moins la même que ci-dessus mais simultanées à l'aide de gevent 🙂
OriginalL'auteur Hackeron
TurboGears livré avec une tâche planifiée des capacités basées sur les Kronos
Je n'ai jamais utilisé de Kronos directement, mais la planification en TG a un bon ensemble de fonctionnalités et est solide.
OriginalL'auteur James Brady
Aucun de la liste des solutions de même tenter d'analyser un complexe cron planifier chaîne. Donc, voici ma version, à l'aide de croniter. Base résumé:
Routines d'assistance:
elif
? Atm je suis en utilisant un programme comme"* * * * *"
puis d'ajouter destime.sleep
supérieure à 1 minute de la "Faites de votre périodique chose"if
, mais je vois toujours les choses dans le sens que si l'énoncé. Quand elle prend plus de 1 minute, je viens de voir la boucle while sauter de manquer l'exécution de la boucle.Le processus pourrait avoir été suspendu, l'horloge pourrait avoir été modifié manuellement ou par le ntp etc. etc. Croniter est utilisé dans la circulation de l'Air et il semble plus complet que le module Crontab et les autres.
OriginalL'auteur rouble
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
OriginalL'auteur ning
J'ai une correction mineure pour la CronTab de la classe de la méthode proposée par Brian.
Le timing était par une seconde conduisant à une seconde, dur boucle à la fin de chaque minute.
OriginalL'auteur benc
Découvrez luigi (https://github.com/spotify/luigi). Il est écrit en python et dispose d'une belle INTERFACE web pour les tâches de surveillance. Il dispose également d'un graphe de dépendance. Peut-être exagéré pour ce que vous avez besoin, mais il va probablement faire l'affaire.
OriginalL'auteur amwinter
Il n'y a pas un "pur python" façon de le faire, parce que certains processus aurait pour lancer python pour exécuter votre solution. Chaque plate-forme aura un ou vingt différentes façons de lancer des processus et de surveiller leurs progrès. Sur les plates-formes unix, cron est l'ancienne norme. Sur Mac OS X, il est également launchd, qui combine cron-lancement avec le chien de garde de la fonctionnalité qui permet de garder vos processus en vie si c'est ce que vous voulez. Une fois que python est en cours d'exécution, vous pouvez utiliser le sched module pour planifier des tâches.
OriginalL'auteur Nick
Juste au cas où, si vous utilisez windows, il existe un pycron. Découvrez http://sourceforge.net/projects/pycron/ .
Pour linux,je vais aller par cron ou sched.
OriginalL'auteur JV.
Brian solution fonctionne assez bien. Cependant, comme d'autres l'ont souligné, il existe une subtile bug dans le code d'exécution. Aussi je l'ai trouvé trop compliqué pour les besoins.
Voici mon plus simple et fonctionnelle alternative pour les exécuter du code dans le cas où quelqu'un en a besoin:
OriginalL'auteur raph.amiard
Une autre solution évidente serait:
Et la classe aqcron.À l'est:
OriginalL'auteur fdb
Si vous êtes à la recherche d'un distribué planificateur, vous pouvez consulter https://github.com/sherinkurian/mani - il ne faut redis si donc peut-être pas ce que vous cherchez. (notez que je suis l'auteur)
cela a été construit pour assurer la tolérance aux pannes par avoir de l'horloge fonctionner sur plus d'un nœud.
OriginalL'auteur shrnkrn
Je ne sais pas si quelque chose comme ce qui existe déjà. Il serait facile d'écrire votre propre avec le temps, datetime et/ou de modules de calendrier, voir http://docs.python.org/library/time.html
La seule préoccupation pour un python solution est que votre travail doit être toujours en cours d'exécution et, éventuellement, être automatiquement "ressuscité" après un redémarrage, quelque chose pour lequel vous ne besoin de compter sur le système dépendants des solutions.
OriginalL'auteur Davide
J'ai pris de Brian solution, a fait quelques changements, ajouté les débuts d'une norme crontab d'un analyseur de fichier, et de le mettre à https://bitbucket.org/dbenamy/devcron.
OriginalL'auteur Dan Benamy
Vous pouvez consulter PiCloud [1] Crons [2], mais notez que vos travaux ne seront pas en cours d'exécution sur votre propre machine. C'est aussi un service que vous devrez payer si vous utilisez plus de 20 heures de temps de calcul d'un mois.
[1] http://www.picloud.com
[2] http://docs.picloud.com/cron.html
OriginalL'auteur BrainCore
Si le script que vous souhaitez exécuter sur le web, vous pourriez envisager d'utiliser un 3e tiers de services, tels que crono, à configurer par programmation de vos travaux.
OriginalL'auteur gduverger
Je sais qu'il y a beaucoup de réponses, mais une autre solution pourrait être d'aller avec décorateurs. Ceci est un exemple de répéter une fonction tous les jours à une heure précise. Cool de penser à utiliser de cette façon est que vous avez seulement besoin d'ajouter le Sucre Syntaxique à la fonction que vous voulez horaire:
Et le décorateur va ressembler:
OriginalL'auteur Damia Fuentes
Méthode de Crontab sur le Serveur.
Python nom de fichier hello.py
Etape 1: Créer un fichier sh laisser donner le nom s.sh
Etape 2: Ouvrez Le Crontab De L'Éditeur
Etape 3: Ajouter Le Temps D'Horaire
Utilisation Crontab Mise En Forme
Ce cron se lancer “À la minute 2.”
OriginalL'auteur shaurya uppal