首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError:不支持的操作数类型为+:'ArgumentParser‘和'int’- and解析日期时间、小时和分钟

TypeError:不支持的操作数类型为+:'ArgumentParser‘和'int’- and解析日期时间、小时和分钟
EN

Stack Overflow用户
提问于 2018-12-03 23:12:55
回答 3查看 452关注 0票数 0

我试图使用argparse来解析命令行参数,如:

代码语言:javascript
复制
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(),它运行得很好,我只需要在控制台上将其更改为给定的参数。

现在它把我扔到:

代码语言:javascript
复制
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:])))

对此有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-03 23:26:56

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

由于只有一个参数,所以可以通过在add_argument调用后添加这一行来解析和获取该参数:

代码语言:javascript
复制
now = now.parse_args().date

现在,变量now有两个含义(首先是解析器,然后是date arg的值),有时可能会有些混乱,但它会工作的。更清楚地写这一节的方法是:

代码语言:javascript
复制
parser = argparse.ArgumentParser()
parser.add_argument('date', type=lambda s: datetime.datetime.strptime(s, '%H:%M'))
args = parser.parse_args()
now = args.date

当然,now现在用词不当,因为它不一定是今天,所以您也可以重命名该变量。:-)

票数 2
EN

Stack Overflow用户

发布于 2018-12-03 23:42:51

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

代码语言:javascript
复制
input1 = sys.argv[1]
now = datetime.datetime.strptime(input1, '%H:%M')
票数 1
EN

Stack Overflow用户

发布于 2021-12-29 16:00:38

我在代码中“解决”了这个问题,方法是:

代码语言:javascript
复制
parser.parse_args()
blocks = args.blocksize
overlap = blocks // 2 # this used to fail with 
    'blocks' being none
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53603365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档