【问题标题】:TypeError: unsupported operand type(s) for +: 'ArgumentParser' and 'int' - argparse datetime hours and minutes类型错误:+ 不支持的操作数类型:'ArgumentParser' 和 'int' - argparse datetime 小时和分钟
【发布时间】: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 对象。

标签: python argparse


【解决方案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 现在是用词不当,因为它不一定是今天,所以您也可以重命名该变量。 :-)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我在我的代码中“解决”了这个问题:

      parser.parse_args()
      blocks = args.blocksize
      overlap = blocks // 2 # this used to fail with 
          'blocks' being none
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
      猜你喜欢
      • 2018-09-01
      • 2013-10-04
      • 2021-06-16
      • 2014-06-16
      • 2014-03-16
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多