【问题标题】:How to show 'too few arguments' error when no sub command is specified for argparse in python3python3中没有为argparse指定子命令时如何显示“参数太少”错误
【发布时间】:2018-10-27 00:43:15
【问题描述】:

一个示例脚本:

import argparse

def main(args=None):
    parser = argparse.ArgumentParser(prog='PROG')

    subparsers = parser.add_subparsers(help='sub-command help')

    parser_a = subparsers.add_parser('a', help='a help')
    parser_a.add_argument('--foo', choices='ABC', help='foo help')

    parser_b = subparsers.add_parser('b', help='b help')
    parser_b.add_argument('--baz', choices='XYZ', help='baz help')

    args = parser.parse_args(args)

if __name__ == '__main__':
    main()

使用 Python2:

$ python2 test.py
usage: PROG [-h] {a,b} ...
PROG: error: too few arguments

这就是我想要的,当命令行中缺少子命令时,脚本会提示缺少参数的错误,并提示我一个简短的使用信息。

但是对于 Python3:

$ python3 test.py
# nothing happens

它不会提示任何有关使用的帮助并静默退出(尽管我可以使用python3 test.py -h 来获取帮助消息)。如何更改代码以使其像 python2 方式一样工作并使其与 Python2 和 Python3 兼容?

所以在 Python2 中,它可以检测到缺少子命令错误并提前退出,但对于 Python3 则不行。对我来说问题是我在parser.parse_args(args) 之后有很多代码依赖于解析的 args,它适用于 python2,我在将它迁移到 Python3 时发现了这个问题,如果在命令行中没有指定子命令,这些代码会引发错误,我需要一种方法来检测命令行中指定了子命令,并且不应该破坏在python2下运行的脚本。

对我来说一个可能的解决方案是检查解析的“args”是否为空,但这对我不起作用,因为我的脚本有一些全局选项,例如:

parser.add_argument('--go', choices='123', help='global option help')

【问题讨论】:

  • 尝试将程序重命名为 test.py 以外的其他名称,以免以后头疼。我在 3.6.5 和 2.7.15 上都看到了您的 Python 3 结果。
  • 我认为脚本名称与结果无关,我在 python3.6.6 和 python2.7.15 下的测试显示的结果与我在问题中描述的不同。
  • 你是对的,它不会,但是隐藏标准库包的名称是不明智的。我只是将我自己的结果作为数据点报告。

标签: python python-3.x argparse


【解决方案1】:

在 3.7 文档中,子命令部分 https://docs.python.org/3/library/argparse.html#sub-commands 包括

  • required - 是否必须提供子命令,默认为 False。

早期的 v3 版本中缺少此功能,但您可以使用

subparsers.required = True

还要确保包含dest='cmd'(或您的选择),以便错误消息可以命名缺少的子解析器命令。

以前需要子解析器(因为在幕后,参数是通常需要的位置)。但是随着 Py3 在测试和报告所需参数的方式上发生了变化,子解析器陷入了困境。所以 Py3 子解析器已经有一段时间不需要了。添加required 参数可以让您选择修复它(默认的 False 是对那个尴尬的临时情况表示赞同)。

In [525]:     parser = argparse.ArgumentParser(prog='PROG')
     ...: 
     ...:     subparsers = parser.add_subparsers(help='sub-command help', dest='
     ...: cmd')
     ...:     subparsers.required = True
     ...:     parser_a = subparsers.add_parser('a', help='a help')
     ...:     parser_a.add_argument('--foo', choices='ABC', help='foo help')
     ...: 
     ...:     parser_b = subparsers.add_parser('b', help='b help')
     ...:     parser_b.add_argument('--baz', choices='XYZ', help='baz help')
     ...: 
     ...:     args = parser.parse_args([])
     ...: 
     ...: 
usage: PROG [-h] {a,b} ...
PROG: error: the following arguments are required: cmd

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2020-10-13
    • 2018-07-09
    • 2019-06-14
    • 2017-11-01
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多