Python 2.x 可选子解析器 - 错误:参数过少

4 投票
2 回答
4083 浏览
提问于 2025-04-18 09:41

我一直在尝试设置一个主解析器和两个子解析器,这样当单独调用主解析器时,它会显示一个帮助信息。

def help_message():
    print "help message"

import argparse
parser = argparse.ArgumentParser()

subparsers = parser.add_subparsers(dest='sp')

parser_a = subparsers.add_parser('a')
parser_a.required = False
#some options...
parser_b = subparsers.add_parser('b')
parser_b.required = False
#some options....

args = parser.parse_args([])

if args.sp is None:
    help_message()
elif args.sp == 'a':
    print "a"
elif args.sp == 'b':
    print "b"

这段代码在Python 3上运行得很好,我希望它在Python 2.x上也能正常工作。

当我运行'python myprogram.py'时,出现了这个问题。

myprogram.py: error: too few arguments

我的问题是:我该如何在命令行中输入'python myprogram.py',然后得到帮助信息,而不是错误信息。

2 个回答

0

对于其他人来说,我在试图弄清楚为什么在使用argparse时不能不带参数直接调用我的脚本时,最终来到了这个页面。

这个教程展示了可选参数和必需参数之间的区别,就是在参数名前面加上"--":

parser.add_argument("--show")  <--- Optional arg
parser.add_argument("show")    <--- Not optional arg
6

我觉得你遇到的是在这个链接讨论的一个bug:http://bugs.python.org/issue9253

你的 subparsers 是一个位置参数。这种参数是必须的,除非你设置了 nargs='?'(或者 *)。我想这就是你在2.7版本中收到错误信息的原因。

不过在最新的Python 3版本中,检查必需参数的方法发生了变化,导致 subparsers 被忽略了。现在它们是 optional(可选的),不再是必需的。有一个建议的补丁可以让 argparse 像以前那样工作(要求有一个subparser的输入)。我预计最终Python 3的 argparse 会恢复到Python 2的做法(可能会增加一个接受 required=False 参数的选项)。

所以与其检查 args.sp is None,你可能想在调用 parse_args 之前检查一下 sys.argv[1:]Ipython 就是这样做的,以生成它自己的帮助信息。

撰写回答