【问题标题】:`argparse` multiple choice argument?`argparse`多项选择参数?
【发布时间】:2015-12-11 13:54:13
【问题描述】:

我正在使用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

我哪里做错了?

【问题讨论】:

  • 你当然要去掉逗号:python script_name.py --sdks aio sw
  • 不带逗号的错误是一样的。分隔符是如何指定的?是空格还是逗号?
  • 我认为这取决于你的shell,但分隔符通常是''。我刚刚测试了你的代码(ubuntu 14.04.3 上的 python 2.7.6),对我来说没问题:/ 错误必须位于 build.py 中
  • 我运行python test.py --sdks aio, sw,打印argsNamespace(sdks=[['aio,', 'sw']])

标签: python argparse


【解决方案1】:

以下效果很好:

import argparse
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']

【讨论】:

  • 实际上,它也适用于append 操作,但提供args.sdks == [['aio', 'sw']]:)
  • 好的,找到了。我正在使用--sdks=aio sw' instead of '--sdks aio sw。所以没有=。谢谢。
  • 能否请您删除append action 语句,action 在这里使用action='store' 似乎可以正常工作。请说明 = 问题,以便我接受您的回答。
  • 你没有在任何地方使用变量sdk_choices
  • 好的,删除sdk_choices 行以避免混淆。
【解决方案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,您需要删除一个额外的列表层。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2019-04-30
    • 1970-01-01
    • 2018-03-04
    • 2021-12-13
    • 1970-01-01
    • 2020-03-16
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多