`argparse`多项选择参数?

时间:2015-09-15 10:35:46

标签: python argparse

我使用argparse来解析Python命令行,该命令行看起来像这样:

python script_name.py --sdks=first, second

我的脚本如下所示:

sdk_choises = ['aio','sw']
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', action='append', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
if 'aio' in args.sdks:
   # do something with aio
if 'sw' in args.sdks:
   # do something with sw

当我执行时: python script_name.py --sdks=aio, sw我收到错误:

"usage: script.py [-h] --sdks SDKS [SDKS ...]  
build.py: error: unrecognized arguments: sw"

我希望能够选择一个或所有选择:

python script_name.py --sdks=first
python script_name.py --sdks=second
python script_name.py --sdks=first, second

我哪里出错了?

2 个答案:

答案 0 :(得分:6)

以下效果很好:

import argparse
sdk_choises = ['aio','sw']
parser = argparse.ArgumentParser(description='Blah blah')
parser.add_argument('--sdks', nargs='+', required=True, help='specifies target SDK(s)')
args = parser.parse_args()
print(args.sdks)

传递选项时,您不需要=,只需使用:

$ python test.py --sdks ai pw
['ai', 'pw']

答案 1 :(得分:2)

如果您更喜欢逗号分隔列表的原始形式,并检查参数是否有效,那么我建议:

parser.add_argument('--sdks', nargs=1, type=lambda s: [sdk_choises[sdk_choises.index(f)] for f in s.split(',')], ...

更简洁的方法是在一个类似于上面的 lambda 的单独函数中定义它:

parser.add_argument('--sdks', nargs=1, type=my_parse_function, ...

argparse 文档有解析函数的示例,并带有正确的错误报告。 如果 nargs=1,您需要删除一个额外的列表层。