【发布时间】:2019-05-05 07:32:49
【问题描述】:
我正在尝试使用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:])))
对此有什么想法吗?
【问题讨论】:
-
您的
now是一个解析器,并且是ArgumentParser类型的对象。这不是解析命令行的结果。args = now.parse_args()将创建一个argparse.Namepace对象。args.date应该是datetime对象。