猿问

如何在Python中获得类似Cron的调度程序?

如何在Python中获得类似Cron的调度程序?

我正在寻找一个Python库,它将提供atcron比如功能。

我非常希望有一个纯Python解决方案,而不是依赖安装在盒子上的工具;这样,我就可以在没有cron的机器上运行。

对于那些不熟悉cron:您可以根据如下表达式调度任务:

 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.

cron时间表达式语法不太重要,但我希望具有这种灵活性。

如果没有什么东西能帮到我的话,我们会很感激地收到任何关于积木的建议。

编辑我对启动过程不感兴趣,只是用Pythonpython函数编写的“作业”。当然,我认为这将是一个不同的线程,但不是在一个不同的过程。

为此,我正在寻找cron时间表达式的表现力,但使用的是Python。

克隆已经有好几年了,但我想尽可能的随身携带。我不能指望它的存在。


慕仙森
浏览 802回答 3
3回答

小唯快跑啊

您可以使用普通的Python参数传递语法来指定crontab。例如,假设我们定义一个事件类如下:from&nbsp;datetime&nbsp;import&nbsp;datetime,&nbsp;timedeltaimport&nbsp;time#&nbsp;Some&nbsp;utility&nbsp;classes&nbsp;/&nbsp;functions&nbsp;firstclass&nbsp;AllMatch(set): &nbsp;&nbsp;&nbsp;&nbsp;"""Universal&nbsp;set&nbsp;-&nbsp;match&nbsp;everything""" &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__contains__(self,&nbsp;item):&nbsp;return&nbsp;TrueallMatch&nbsp;=&nbsp;AllMatch()def&nbsp;conv_to_set(obj):&nbsp;&nbsp;#&nbsp;Allow&nbsp;single&nbsp;integer&nbsp;to&nbsp;be&nbsp;provided &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;isinstance(obj,&nbsp;(int,long)): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;set([obj])&nbsp;&nbsp;#&nbsp;Single&nbsp;item &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;isinstance(obj,&nbsp;set): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;=&nbsp;set(obj) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;obj#&nbsp;The&nbsp;actual&nbsp;Event&nbsp;classclass&nbsp;Event(object): &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;action,&nbsp;min=allMatch,&nbsp;hour=allMatch,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;day=allMatch,&nbsp;month=allMatch,&nbsp;dow=allMatch,&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;args=(),&nbsp;kwargs={}): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.mins&nbsp;=&nbsp;conv_to_set(min) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.hours=&nbsp;conv_to_set(hour) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.days&nbsp;=&nbsp;conv_to_set(day) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.months&nbsp;=&nbsp;conv_to_set(month) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.dow&nbsp;=&nbsp;conv_to_set(dow) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.action&nbsp;=&nbsp;action &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.args&nbsp;=&nbsp;args &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.kwargs&nbsp;=&nbsp;kwargs&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;matchtime(self,&nbsp;t): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""Return&nbsp;True&nbsp;if&nbsp;this&nbsp;event&nbsp;should&nbsp;trigger&nbsp;at&nbsp;the&nbsp;specified&nbsp;datetime""" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((t.minute&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;self.mins)&nbsp;and &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(t.hour&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;self.hours)&nbsp;and &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(t.day&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;self.days)&nbsp;and &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(t.month&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;self.months)&nbsp;and &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(t.weekday()&nbsp;&nbsp;in&nbsp;self.dow)) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;check(self,&nbsp;t): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.matchtime(t): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.action(*self.args,&nbsp;**self.kwargs)(注:未彻底测试)然后,您的CronTab可以在常规python语法中指定如下:c&nbsp;=&nbsp;CronTab( &nbsp;&nbsp;Event(perform_backup,&nbsp;0,&nbsp;2,&nbsp;dow=6&nbsp;), &nbsp;&nbsp;Event(purge_temps,&nbsp;0,&nbsp;range(9,18,2),&nbsp;dow=range(0,5)))这样,您就可以充分利用Python的参数机制(混合位置和关键字args,并且可以使用符号名称来表示数周和几个月的名称)。CronTab类将被定义为简单地以分钟增量休眠,并对每个事件调用CHECK()。(夏令时/时区可能有一些微妙之处,值得警惕。)下面是一个快速实现:class&nbsp;CronTab(object): &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;*events): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.events&nbsp;=&nbsp;events&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;run(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t=datetime(*datetime.now().timetuple()[:5]) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;e&nbsp;in&nbsp;self.events: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.check(t) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;+=&nbsp;timedelta(minutes=1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;datetime.now()&nbsp;<&nbsp;t: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time.sleep((t&nbsp;-&nbsp;datetime.now()).seconds)需要注意的是:Python的工作日/月是零索引的(不像cron),而且这个范围排除了最后一个元素,因此像“1-5”这样的语法变成了范围(0,5)-即[0,1,2,3,4]。如果您更喜欢cron语法,那么解析应该不会太困难。
随时随地看视频慕课网APP

相关分类

Python
我要回答