Argparser标志,没有带优先级的参数

时间:2017-07-19 23:40:48

标签: python command-line-interface argparse

我有几个位置和可选参数(使用argparser),现在需要添加一个不带参数/值的标志,实质上是调用方法。

让我们说这是当前的解析器:

./run.py arg1 arg2 -i input

这是简短的示例代码

parser.add_argument("arg1",
                    help="arg1 handler")
parser.add_argument("arg2",
                    help="arg2 handler")
parser.add_argument('-i', dest='input_handler',
                    help="input handler")
当你使用--help导致显示帮助时(优先于其他标志),

我正在寻找的东西是类似的。 所以我想支持一个特殊的标志(比如--help)而不用担心在命令行中提供所有其他标志。

所以这样的事情也应该有效:

./run.py --list

我正在考虑使用'store_true'来获取没有值的标志,但它没有优先于其他标志。

非常感谢任何意见/建议

3 个答案:

答案 0 :(得分:0)

你可以使用这样的东西:

parser = argparse.ArgumentParser()
parser.add_argument('--list',action='store_true',help='perform some task')
parser.add_argument('--input',type=str, required=False, help='input variable')

args = parser.parse_args()

if args.list:
    perform_function()
elif args.input is not None:
    function(args.input)
...

答案 1 :(得分:0)

您错过了nargs字段。

#!/usr/bin/env python
"""Runs using two args and an option input

Usage: ./run.py arg1 arg2 -i input

Arguments:
    arg1/arg2: any order

Options:
   -i input
"""
import argparse

parser = argparse.ArgumentParser(usage=__doc__)
parser.add_argument("pos_args", help="Unknown pos args sequence", nargs=2)  # '+' for any number of args
parser.add_argument('-i', dest='input_handler', help="input handler")

args = parser.parse_args()

arg1, arg2 = args.pos_args

答案 2 :(得分:0)

-h帮助优先,因为它在遇到时强制sys.exit。也就是说,它有一个Action类打印帮助然后退出。

有一个version动作类可以执行类似操作 - 显示消息并退出。

所有其他操作都会在args命名空间中存储内容,并继续解析。 missing arguments投诉在解析结束时产生,当它推断某些位置(或其他必需)参数未被填充时。

我可以想到几个解决方案:

  • 定义一个以helpversion为模型的新Action子类。如果你采取这种方式,你应该进行开发,所以你确切知道发生了什么。

  • 将您的位置更改为可选的位置。 nargs='?'是可能的,但标记更好。在这种情况下,input_handler可以是简单的store_true操作。

  • 使用subparsers。 input_handler将是不带参数的解析器。其他subparser将采取2个位置。查看subparsers文档和set_defaults注释。