Argparse 错误:python2.x 上的参数太少

Posted

技术标签:

【中文标题】Argparse 错误:python2.x 上的参数太少【英文标题】:Argparse error: Too few arguments on python2.x 【发布时间】:2020-10-13 12:19:06 【问题描述】:

我正在尝试将 argparse 库与 python2 一起使用,但它总是报错:

代码:

parent_parser = argparse.ArgumentParser()
sub_parsers = parent_parser.add_subparsers(title = "actions")

parser_create = sub_parsers.add_parser("create", parents = [parent_parser], add_help = False, description = "Create new Customer account.", help = "create")
parser_create.add_argument('-p', '--password', help = 'User Password', required = True)
parser_create.add_argument('-n', '--fullname', nargs = 2, help = 'User Full Name', required = True)
parser_create.add_argument('-e', '--email', required = True, help = "User Email address")

parser_deactivate = sub_parsers.add_parser("deactivate", parents = [parent_parser], add_help = False, description = "Deactivate existing customer account.", help = "deactivate.")
parser_deactivate.add_argument('-e','--email', required = True, help = "User Email address")
args = parent_parser.parse_args()

输出:

[root@localhost ~]# python2 create-user.py deactivate -e o@x.com

usage: create-user.py deactivate [-h] -e EMAIL create,deactivate ...
create-user.py deactivate: error: too few arguments

使用create 而不是deactivate 时出现同样的错误。

它在 python3.x 中也能正常工作。

【问题讨论】:

为什么要将parent_parser 作为父级添加到子解析器?只需删除它。 python2 create-user.py -h 给出什么输出?生成的在线帮助应该显示 argparse 的预期 @无用用法:test.py create [-h] -p PASSWORD -f FULLNAME FULLNAME -e EMAIL create,deactivate ... 可选参数:-h, --help 显示此帮助消息并退出 -p PASSWORD, --password PASSWORD 用户密码 -f FULLNAME FULLNAME, --fullname FULLNAME FULLNAME 用户全名 -e EMAIL, --email EMAIL 用户电子邮件地址操作:create,deactivate create 创建新客户帐户deactivate 停用新客户帐户。 在 py2 中需要子解析器,在 py3 中不需要(默认情况下)。所以 parent_parser 的递归使用不会给 py3 带来问题,但确实使 py2 成为不可能。删除 parents 位。 该信息应该在问题中,在哪里清晰易读。 【参考方案1】:

parents 用于“继承”来自一个或多个解析器的参数,而无需在多个解析器之间重复它们的定义。

您的子解析器不需要这样做。您实际上是在说使用子命令deactivate 后,您需要再次指定createdeactivate,从而导致无限循环。

只需省略子解析器的 parents 参数即可。

import argparse


parser = argparse.ArgumentParser()
sub_parsers = parser.add_subparsers(title="actions")

parser_create = sub_parsers.add_parser("create", 
                                       description="Create new Customer account.")
parser_create.add_argument('-p', '--password',
                           help='User Password', required=True)
parser_create.add_argument('-n', '--fullname', nargs=2,
                           help='User Full Name', required=True)
parser_create.add_argument('-e', '--email', required=True,
                           help="User Email address")

parser_deactivate = sub_parsers.add_parser("deactivate",
                                           description="Deactivate existing customer account.")
parser_deactivate.add_argument('-e','--email', required=True,
                               help="User Email address")

args = parser.parse_args()

示例运行:

$ python2 create-user.py deactivate -e o@x.com
Namespace(email='o@x.com')

可能使用父解析器的一种方法是从单个解析器继承--email

parser = argparse.ArgumentParser()

email_parser = argparse.ArgumentParser(add_help=False)
email_parser.add_argument("-e", "--email", required=True,
                          help="User Email address")

sub_parsers = parser.add_subparsers(title="actions")

parser_create = sub_parsers.add_parser("create",
                                       description="Create new Customer account.",
                                       parents=[email_parser])
parser_create.add_argument('-p', '--password',
                           help='User Password', required=True)
parser_create.add_argument('-n', '--fullname', nargs=2,
                           help='User Full Name', required=True)

parser_deactivate = sub_parsers.add_parser("deactivate",
                                           description="Deactivate existing customer account.",
                                           parents=[email_parser])

args = parser.parse_args()

【讨论】:

此解决方法也不起作用。我的代码实际上适用于 python3 但不适用于 python2 那你在其他地方有问题。此处的代码适用于 Python 2 和 Python 3。 我只在一个单独的脚本中执行了这部分,它失败并出现同样的错误,所以看起来代码本身不是其他地方的问题。 您正在做的某事 不同,但未反映在问题中。此答案中的代码有效。

以上是关于Argparse 错误:python2.x 上的参数太少的主要内容,如果未能解决你的问题,请参考以下文章

argparse 错误:无法识别选项

弧长的参方程表示形式

使用 Argparse 的 Python 错误

使用 unittest 测试 argparse - 退出错误

为啥我的 argparse 抛出 SystemExit 2 错误?

Python3 覆盖 argparse 错误