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

TypeError:不支持+:“ArgumentParser”和“int”-argparse datetime小时和分钟的操作数类型

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

    我想用 argparse 以小时和分钟为单位分析命令行参数的步骤 %H:%M

    import croniter
    import datetime
    import re
    import sys
    import time
    import argparse
    from sys import argv
    
    now = argparse.ArgumentParser() #datetime.datetime.now()
    now.add_argument('date', type=lambda s: datetime.datetime.strptime(s, '%H:%M'))
    
    def main():
        f = sys.stdin
        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()
    

    我这样使用这个脚本 python myfile.py 14:45 < /etc/crontab

    它应该解析crontab文件,读取其内容,并在给定hours和minutes参数的情况下打印每个任务的运行时间。

    在我尝试将参数解析器添加到脚本之前,一切都正常。

    正如您所看到的,以前的版本正在使用 now=datetime.datetime.now() 它工作得很好,我只需要把它转换成控制台上给定的参数。

    Traceback (most recent call last):
    File "cron.py", line 24, in <module>
    main()
    File "cron.py", line 21, in main
    print("%s %s" % (cron.get_next(datetime.datetime), ' '.join(a[5:])))
    File "/home/user/.virtualenvs/rest_tails2/lib/python3.6/site-packages/croniter/croniter.py", line 103, in get_next
    return self._get_next(ret_type or self._ret_type, is_prev=False)
    File "/home/user/.virtualenvs/rest_tails2/lib/python3.6/site-packages/croniter/croniter.py", line 193, in _get_next
    nth_weekday_of_month, is_prev)
    File "/home/user/.virtualenvs/rest_tails2/lib/python3.6/site-packages/croniter/croniter.py", line 235, in _calc
    dst = now = self._timestamp_to_datetime(now + sign * offset)
    TypeError: unsupported operand type(s) for +: 'ArgumentParser' and 'int'
    

    这是一条令人不快的线: print("%s %s" % (cron.get_next(datetime.datetime), ' '.join(a[5:])))

    有什么想法吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   kindall    6 年前

    您从不调用解析器,而且 now 是解析器,不是日期。

    因为您只有一个参数,所以可以通过在 add_argument 电话:

    now = now.parse_args().date
    

    现在你的变量 有两种含义(首先是解析器,然后是 date

    parser = argparse.ArgumentParser()
    parser.add_argument('date', type=lambda s: datetime.datetime.strptime(s, '%H:%M'))
    args = parser.parse_args()
    now = args.date
    

    当然

        2
  •  1
  •   Manoj Singh    6 年前

    input1 = sys.argv[1]
    now = datetime.datetime.strptime(input1, '%H:%M')