Crontab'ınızı belirtmek için normal Python argümanını geçen sözdizimini kullanabilirsiniz. Örneğin, bir Event sınıfını aşağıdaki gibi tanımladığımızı varsayalım:
from datetime import datetime, timedelta
import time
# Some utility classes / functions first
class AllMatch(set):
"""Universal set - match everything"""
def __contains__(self, item): return True
allMatch = AllMatch()
def conv_to_set(obj): # Allow single integer to be provided
if isinstance(obj, (int,long)):
return set([obj]) # Single item
if not isinstance(obj, set):
obj = set(obj)
return obj
# The actual Event class
class Event(object):
def __init__(self, action, min=allMatch, hour=allMatch,
day=allMatch, month=allMatch, dow=allMatch,
args=(), kwargs={}):
self.mins = conv_to_set(min)
self.hours= conv_to_set(hour)
self.days = conv_to_set(day)
self.months = conv_to_set(month)
self.dow = conv_to_set(dow)
self.action = action
self.args = args
self.kwargs = kwargs
def matchtime(self, t):
"""Return True if this event should trigger at the specified datetime"""
return ((t.minute in self.mins) and
(t.hour in self.hours) and
(t.day in self.days) and
(t.month in self.months) and
(t.weekday() in self.dow))
def check(self, t):
if self.matchtime(t):
self.action(*self.args, **self.kwargs)
(Not: İyice test edilmemiştir)
Daha sonra CronTab'ınız normal python sözdiziminde şu şekilde belirtilebilir:
c = CronTab(
Event(perform_backup, 0, 2, dow=6 ),
Event(purge_temps, 0, range(9,18,2), dow=range(0,5))
)
Bu şekilde Python'un argüman mekaniğinin tam gücünü elde edersiniz (konum ve anahtar kelime argümanlarını karıştırır ve haftalar ve aylar için sembolik isimler kullanabilirsiniz)
CronTab sınıfı, yalnızca küçük artışlarla uyumak ve her olayda check () öğesini çağırmak olarak tanımlanır. (Muhtemelen gün ışığından yararlanma saati / zaman dilimlerine karşı dikkatli olunması gereken bazı incelikler vardır). İşte hızlı bir uygulama:
class CronTab(object):
def __init__(self, *events):
self.events = events
def run(self):
t=datetime(*datetime.now().timetuple()[:5])
while 1:
for e in self.events:
e.check(t)
t += timedelta(minutes=1)
while datetime.now() < t:
time.sleep((t - datetime.now()).seconds)
Dikkat edilmesi gereken birkaç nokta: Python'un hafta içi / ayları sıfır endekslidir (cron'dan farklı olarak) ve bu aralık son öğeyi hariç tutar, bu nedenle "1-5" gibi sözdizimi aralık (0,5) - yani [0,1,2, 3,4]. Cron sözdizimini tercih ediyorsanız, ayrıştırmak çok zor olmamalıdır.