Python 从cron表达式创建apscheduler作业触发器
我正在尝试使用python中的cron表达式运行一些计划作业。我是python新手,我已经使用java中的quartz调度器实现了几乎相同的功能。现在,我正在尝试使用python中的ApsScheduler。我知道这是可以做到的使用Python 从cron表达式创建apscheduler作业触发器,python,cronexpression,apscheduler,Python,Cronexpression,Apscheduler,我正在尝试使用python中的cron表达式运行一些计划作业。我是python新手,我已经使用java中的quartz调度器实现了几乎相同的功能。现在,我正在尝试使用python中的ApsScheduler。我知道这是可以做到的使用 crontrig=CronTrigger(分钟='*',秒='*') 但是,我正在使用cron表达式(如“0/5*****”),我想知道是否有任何东西可以直接解析表达式并生成CronTrigger 鉴于APScheduler支持一组稍有不同的字段,这些表达式如何映射
crontrig=CronTrigger(分钟='*',秒='*')代码>
但是,我正在使用cron表达式(如“0/5*****”),我想知道是否有任何东西可以直接解析表达式并生成CronTrigger 鉴于APScheduler支持一组稍有不同的字段,这些表达式如何映射到CronTrigger的参数并不明显
我还应该指出,调度作业的首选方法不涉及直接实例化触发器,而是提供添加_job()的参数
如果您想自己这样做,您可以简单地拆分表达式并将元素映射到所需的触发器参数。鉴于APScheduler支持稍微不同的字段集,这些表达式如何映射到CronTrigger的参数并不明显
我还应该指出,调度作业的首选方法不涉及直接实例化触发器,而是提供添加_job()的参数
如果您想自己这样做,您可以简单地拆分表达式并将元素映射到您想要的任何触发器参数。如@Alex所述。我创建了一个函数来映射要触发的值
下面的函数将按顺序返回一个元组
年、月、日、周、周中的日、小时、分钟、秒。期待一些建议
def evaluate(self, expression):
'''
order of values
year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone
'''
splitValues = expression.split();
for i in range(0,8):
if (i == 0):
if (splitValues[0] == '?'):
year = None;
else:
year = splitValues[0];
if (i == 1):
if (splitValues[1] == '?'):
month = None;
else:
month = splitValues[1];
if (i == 2):
if (splitValues[2] == '?'):
day = None;
else:
day = splitValues[2];
if (i == 3):
if (splitValues[3] == '?'):
week = None;
else:
week = splitValues[3];
if (i == 4):
if (splitValues[4] == '?'):
day_of_week = None;
else:
day_of_week = splitValues[4];
if (i == 5):
if (splitValues[5] == '?'):
hour = None;
else:
hour = splitValues[5];
if (i == 6):
if (splitValues[6] == '?'):
minute = None;
else:
minute = splitValues[6];
if (i == 7):
if (splitValues[7] == '?'):
second = None;
else:
second = splitValues[7];
return year, month, day, week, day_of_week, hour, minute, second;
我使用这个表达式创建了一个createTrigger函数
def getTrigger(self,cronExpression):
year, month, day, week, day_of_week, hour, minute, second = evaluate(cronExpression);
trigger = CronTrigger(year, month, day, week, day_of_week, hour, minute, second)
return trigger;
正如@Alex提到的。我创建了一个函数来映射要触发的值
下面的函数将按顺序返回一个元组
年、月、日、周、周中的日、小时、分钟、秒。期待一些建议
def evaluate(self, expression):
'''
order of values
year, month, day, week, day_of_week, hour, minute, second, start_date, end_date, timezone
'''
splitValues = expression.split();
for i in range(0,8):
if (i == 0):
if (splitValues[0] == '?'):
year = None;
else:
year = splitValues[0];
if (i == 1):
if (splitValues[1] == '?'):
month = None;
else:
month = splitValues[1];
if (i == 2):
if (splitValues[2] == '?'):
day = None;
else:
day = splitValues[2];
if (i == 3):
if (splitValues[3] == '?'):
week = None;
else:
week = splitValues[3];
if (i == 4):
if (splitValues[4] == '?'):
day_of_week = None;
else:
day_of_week = splitValues[4];
if (i == 5):
if (splitValues[5] == '?'):
hour = None;
else:
hour = splitValues[5];
if (i == 6):
if (splitValues[6] == '?'):
minute = None;
else:
minute = splitValues[6];
if (i == 7):
if (splitValues[7] == '?'):
second = None;
else:
second = splitValues[7];
return year, month, day, week, day_of_week, hour, minute, second;
我使用这个表达式创建了一个createTrigger函数
def getTrigger(self,cronExpression):
year, month, day, week, day_of_week, hour, minute, second = evaluate(cronExpression);
trigger = CronTrigger(year, month, day, week, day_of_week, hour, minute, second)
return trigger;
对@raghu venmarathoor代码进行了小改动
def get_trigger(expression):
# type: (str) -> CronTrigger
"""
Evaluates a CronTrigger obj from cron expression
:param expression: String representing the crons five first fields, e.g : '* * * * *'
:return: A CronTrigger
"""
vals = expression.split()
vals = [(None if w == '?' else w) for w in vals]
return CronTrigger(minute=vals[0], hour=vals[1], day=vals[2], month=vals[3], day_of_week=vals[4])
更新
在版本3.5.0中,添加了以下方法:
CronTrigger.from_crontab()
对@raghu venmarathoor代码进行了小改动
def get_trigger(expression):
# type: (str) -> CronTrigger
"""
Evaluates a CronTrigger obj from cron expression
:param expression: String representing the crons five first fields, e.g : '* * * * *'
:return: A CronTrigger
"""
vals = expression.split()
vals = [(None if w == '?' else w) for w in vals]
return CronTrigger(minute=vals[0], hour=vals[1], day=vals[2], month=vals[3], day_of_week=vals[4])
更新
在版本3.5.0中,添加了以下方法:
CronTrigger.from_crontab()
谢谢我只是想知道这个问题是否已经有了解决方案。谢谢。我只是想知道这个问题是否已经有了解决方案。