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

时间:2018-12-03 23:12:55

标签: python argparse

我正在尝试使用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文件,读取它的内容,并在指定小时和分钟参数的情况下打印每个任务的运行时间。

一切正常,直到我尝试将参数解析器添加到脚本中为止。

您可以看到以前的版本正在使用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 个答案:

答案 0 :(得分:1)

您永远不会调用解析器,并且now是解析器,而不是日期。

由于只有一个参数,因此可以通过在add_argument调用之后添加以下行来解析并获取该参数:

now = now.parse_args().date

现在您的变量now具有两种含义(首先是解析器,然后是date arg的值),有时可能会造成一些混乱,但是可以使用。编写该部分的更清晰方法是:

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

当然now现在是错误的称呼,因为它不一定在今天,因此您也可以重命名该变量。 :-)

答案 1 :(得分:1)

获取参数并解析它的更简单方法:

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