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
后,您需要再次指定create
或deactivate
,从而导致无限循环。
只需省略子解析器的 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 上的参数太少的主要内容,如果未能解决你的问题,请参考以下文章
使用 unittest 测试 argparse - 退出错误