Python 2.x 可选子解析器 - 错误:参数过少
我一直在尝试设置一个主解析器和两个子解析器,这样当单独调用主解析器时,它会显示一个帮助信息。
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
就是这样做的,以生成它自己的帮助信息。