代码之家  ›  专栏  ›  技术社区  ›  NeoVe

Python-Croniter-必须为iteratorexpression指定5或6列

  •  0
  • NeoVe  · 技术社区  · 6 年前

    import croniter
    import datetime
    
    now = datetime.datetime.now()
    
    def main():
    
        f = open("/etc/crontab","r")
        f1 = f.readlines()
        for x in f1:
            cron = croniter.croniter(x, now) 
            cron.get_next(datetime.datetime)
            print(x)
    
    if __name__ == "__main__":
        main()
    

    有了这个剧本,我的目标是读一本书 /etc/crontab 文件,并在下次运行每个计划作业时打印。

    然而,在这个脚本中,它向我抛出了这样一个问题:

    Traceback (most recent call last):
    File "cron.py", line 19, in <module>
    main()
    File "cron.py", line 14, in main
    cron = croniter.croniter(x, now) # Here!
    File "/home/user/.virtualenvs/rest_tails2/lib/python3.6/site-packages/croniter/croniter.py", line 92, in __init__
    self.expanded, self.nth_weekday_of_month = self.expand(expr_format)
    File "/home/user/.virtualenvs/rest_tails2/lib/python3.6/site-packages/croniter/croniter.py", line 467, in expand
    raise CroniterBadCronError(cls.bad_length)
    croniter.croniter.CroniterBadCronError: Exactly 5 or 6 columns has to be specified for iteratorexpression.
    

    我是克洛尼特的新手,有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   cody    6 年前

    中可能存在crontab条目以外的内容 /etc/crontab

    您只需要考虑包含实际CRON模式的行,如下所示:

    import croniter
    import datetime
    import re
    
    now = datetime.datetime.now()
    
    def main():
    
        f = open("/etc/crontab","r")
        f1 = f.readlines()
        for x in f1:
            if not re.match('^[0-9*]', x):
                continue
            a = re.split(r'\s+', x)
            cron = croniter.croniter(' '.join(a[:5]), now)
            print("%s %s" % (cron.get_next(datetime.datetime), ' '.join(a[5:])))
    
    if __name__ == "__main__":
        main()
    

    输出(您的将有所不同):

    2018-12-02 15:17:00 root cd / && run-parts --report /etc/cron.hourly
    2018-12-03 06:25:00 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    2018-12-09 06:47:00 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    2019-01-01 06:52:00 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )