【问题标题】:Python argparse: metavar and action=store_true togetherPython argparse:metavar 和 action=store_true 一起
【发布时间】:2012-08-13 12:37:09
【问题描述】:

我在 Python 中使用 argparse 模块来解析在命令行界面中键入的参数。我有以下对子解析器对象的 add_argument 调用:

submit_parser.add_argument('-pv','--provision',metavar='PROVISION', dest='PROVISION',
                                 help='provision system',
                                 action='store_true', default=False, required=False)

我得到这个错误:

Traceback (most recent call last):
  File "./scripts/tp4", line 94, in <module> 
    main()
  File "./scripts/tp4", line 74, in main 
    modloader.loadModules(sub_parsers)
  File "/usr/lib/python2.6/site-packages/tp4/cli/Moduleloader.py", line 66, in loadModules 
    registered_modules[module_name].setSubparserArgs(module_sub_parser)
  File "/usr/lib/python2.6/site-packages/tp4/cli/modules/AutotestModule.py", line 135, in setSubparserArgs
    action='store_true', default=False, required=False)
  File "/usr/share/tp4/cli/zip/argparse.zip/argparse.py", line 1302, in add_argument
    TypeError: __init__() got an unexpected keyword argument 'metavar'

如果我删除 action 或 metavar 参数,它会起作用。为什么两个人不能在一起? http://docs.python.org/dev/library/argparse.html 的 argparse 文档中没有关于此限制的内容。

提前感谢您的帮助

【问题讨论】:

  • python版本....是重要的东西要检查....
  • 不是你问的,但是如果action'store_true',默认值已经是False(如果action是'store_false',默认值是True)。这很方便,虽然与optparse 不同(在这两种情况下默认为None)。

标签: python argparse


【解决方案1】:

元变量只对位置参数有意义(想想命令行末尾的文件名)或当参数接受自己的参数时(如--input-files foo.txt bar.txt)。

您的--provision 参数是一个标志,因为您将action 设置为store_true。它不接受任何参数(即,nargs 未设置)。因此,拥有元变量是没有意义的。

来自the argparse documentation

ArgumentParser 生成帮助消息时,它需要某种方式来引用每个预期的参数。默认情况下,ArgumentParser 对象使用 dest 值作为每个对象的“名称”。默认情况下,对于位置参数动作,直接使用 dest 值,对于可选参数动作,dest 值是大写的。因此,dest='bar' 的单个位置参数将被称为 bar。单个可选参数 --foo 后面应该跟一个命令行参数,这将被称为 FOO。

【讨论】:

  • 感谢您的解释。但是,此信息在 argparse 文档中并不明确。
  • 对于稀疏的 python 文档,我总是从 PYMOTW 网站pymotw.com/2/argparse 获得答案
  • 我使用的是metavar=,而我真正想要的是dest=
  • 我已经在这里登陆了两次,并会重申@aldo Use dest 的评论"
【解决方案2】:

要从@pwc 中提取答案,您需要使用dest 而不是metavar

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2021-03-03
    • 2020-03-21
    • 1970-01-01
    • 2019-10-14
    • 2021-07-07
    • 2019-08-31
    • 2017-07-10
    • 2012-03-07
    相关资源
    最近更新 更多