python: расширенный планировщик python — планирование в стиле cron — передача параметров функции

#python #cron #scheduler

#python #cron #планировщик

Вопрос:

Я пытаюсь запланировать работу в стиле con, используя расширенный планировщик python. Все в порядке, когда я использую функцию, которая не требует каких-либо параметров, однако я не могу запланировать одно и то же задание, передающее один или несколько аргументов. Не могли бы вы посоветовать?

 from apscheduler.scheduler import Scheduler

def job_def(var1, var2):
    print "%s - %s" % (str(var1), str(var2))


s = Scheduler()

s.add_cron_job(job_def,['hello', 'there'], seconds='*/30')

s.start()
 

Ошибка:

 Traceback (most recent call last):   File "<stdin>", line 1, in <module> 

File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler scheduler.py", line 346, in add_cron_job start_date=start_date)   

File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/__init__.py", line 44, in __init__  field = field_class(field_name, exprs, is_default)   

File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 29, in __init__ self.compile_expressions(exprs)   

File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 56, in compile_expressions self.compile_expression(expr)   

File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/triggers/cron/fields.py", line 69, in compile_expression (expr, self.name))
 

Ответ №1:

Во-первых, согласно документации, это должно быть second="*/30" вместо seconds="*30/" , тогда add_cron_job прототип метода :

     def add_cron_job(self, func, year=None, month=None, day=None,
 week=None, day_of_week=None, hour=None, minute=None, second=None,
 start_date=None, args=None, kwargs=None, **options):

         """
         Schedules a job to be completed on times that match the given
         expressions.

         :param func: callable to run
         :param year: year to run on
         :param month: month to run on
         :param day: day of month to run on
         :param week: week of the year to run on
         :param day_of_week: weekday to run on (0 = Monday)
         :param hour: hour to run on
         :param second: second to run on
         :param args: list of positional arguments to call func with
         :param kwargs: dict of keyword arguments to call func with
         :param name: name of the job
         :param jobstore: alias of the job store to add the job to
         :param misfire_grace_time: seconds after the designated run time that
             the job is still allowed to be run
         :return: the scheduled job
         :rtype: :class:`~apscheduler.job.Job`
         """
 

итак, в вашем случае вы должны написать что-то вроде этого :

 from apscheduler.scheduler import Scheduler

def job_def(var1, var2):
    print "%s - %s" % (str(var1), str(var2))


s = Scheduler()

s.add_cron_job(job_def, args=['hello', 'there'], second='*/30')

s.start()
 

Комментарии:

1. @m1k3y02: я отредактировал свой ответ с правильным вызовом add_cron_job .

2. работает как шарм! Я думаю, что мне не хватает некоторых основ чтения документации

Ответ №2:

Разве это не было бы проще в использовании

s.add_interval_job(job_def, аргументы =[‘привет’,’там’], секунды = 30)

вместо этого?

Комментарии:

1. — секунды = 30 будет 00:00:30, 00:01:30 выполняется каждую минуту. — секунды = * / 30 включает 0, поэтому 00:00:00, 00:00:30, 00:01:00, 00:01:30, каждые 30 секунд