TypeError: неподдерживаемые типы операндов для +: 'ArgumentParser' и 'int' - argparse datetime часы и минуты - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь использовать 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 голосов
/ 04 декабря 2018

Более простой способ взять аргумент и разобрать его:

input1 = sys.argv[1]
now = datetime.datetime.strptime(input1, '%H:%M')
0 голосов
/ 04 декабря 2018

Вы никогда не вызываете синтаксический анализатор, и now является синтаксическим анализатором, а не датой.

Поскольку у вас есть только один аргумент, вы можете проанализировать и получить этот аргумент, добавив эту строку после add_argument call:

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 теперь неверно, так как это не обязательно сегодня, так что вы также можете переименовать эту переменную.: -)

...