我在Python中使用argparse模块来解析在命令行界面中输入的参数。我对subparser对象进行了以下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'
如果我删除动作或metavar参数,它会起作用。为什么两者不能在一起?在http://docs.python.org/dev/library/argparse.html的argparse文档中没有任何关于此限制的内容。
提前感谢您提供任何帮助
答案 0 :(得分:16)
元数据只对位置参数(在命令行末尾的文件名)或者参数接受自己的参数(如--input-files foo.txt bar.txt
)有意义。
您的--provision
参数是一个标记,因为您将action
设置为store_true
。它不需要任何参数(即,nargs
未设置)。因此,拥有一个metavar是没有意义的。
当
ArgumentParser
生成帮助消息时,需要某种方式来引用每个预期的参数。默认情况下,ArgumentParser
个对象使用dest值作为每个对象的“名称”。默认情况下,对于位置参数操作,直接使用dest值,对于可选参数操作,dest值是大写的。因此,dest='bar'
的单个位置参数将被称为bar。单个可选参数--foo
后面应该跟一个命令行参数将被称为FOO。
答案 1 :(得分:-2)
要从@pwc中提取答案,您需要使用dest
代替metavar
。