【问题标题】:Argparser flag with no argument with precedence没有参数的argparse标志优先
【发布时间】:2017-12-25 10:43:57
【问题描述】:

我有几个位置参数和可选参数(使用 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' 来获取没有值的标志,但它并不优先于其他标志。

非常感谢任何 cmets/建议

【问题讨论】:

  • 如果您还共享了一些代码,可能会很有用。这可能有助于人们了解您到底想要实现什么。
  • 为什么需要优先权?您可以解析您的论点,然后在对其他论点采取行动之前检查--list 是否存在。
  • 我想让./run.py --list 工作。类似于./run --help,不需要任何其他标志/参数。如果我不提供所有其他参数,argparser 会抱怨缺少参数。

标签: python command-line-interface argparse


【解决方案1】:

你可以这样使用:

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)
...

【讨论】:

    【解决方案2】:

    您缺少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
    

    【讨论】:

    • 你真的试过这个吗? nargs="2" 可能会在创建、解析或显示帮助时引发某种错误。
    • 修正:不要在期望整数的地方使用引号。
    【解决方案3】:

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

    有一个 version 动作类做类似的事情 - 显示一条消息并退出。

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

    我能想到几个解决方案:

    • 定义一个以helpversion 为模型的新Action 子类。如果你走这条路,你应该做开发,这样你就知道发生了什么。

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2014-07-09
      • 2020-10-23
      • 2020-02-12
      • 2016-09-27
      • 2021-10-20
      • 2017-07-03
      • 1970-01-01
      相关资源
      最近更新 更多