使用argparse处理带子命令的可选参数
我在创建命令行工具时遇到了一些麻烦,想要让用户可以选择性地添加测试参数。现在我已经做到了一些事情:
python test.py --test build --name foobar
在这里,build是一个子命令,而--test则是让系统指向默认的测试服务器。不过,我希望用户在--test后面可以指定一个额外的、可选的服务器地址,这样他们就可以把测试服务器指向任何他们想要的地方。举个例子:
python test.py --test "<random http>" build --name foobar
我现在的代码看起来是这样的:
main_parser = argparse.ArgumentParser()
main_parser.add_argument('--test', action='store', nargs=1, dest='test_server', help='Use test server')
subparsers = main_parser.add_subparsers(help='SubCommands', dest='command')
build_parser = subparsers.add_parser('build', help = 'lists the build command(s) for the specified view/warehouse')
build_parser.add_argument('--name', action='store', nargs=1, dest='build_name')
但是,无论我把nargs改成什么,它都不允许使用原来的参数,也就是单独的--test。我想知道有没有办法同时支持这两种情况?
1 个回答
1
你可以使用可选的参数数量设置,方法是用 nargs='?'
,但是正如Karoly Horvath所说,你的语法会有些模糊。你最好在你的构建子解析器中添加 --test 这个选项。
main_parser = argparse.ArgumentParser()
subparsers = main_parser.add_subparsers(help='SubCommands', dest='command')
build_parser = subparsers.add_parser('build', help = 'lists the build command(s) for the specified view/warehouse')
build_parser.add_argument('--test', action='store', nargs='?', dest='test_server', help='Use test server')
build_parser.add_argument('--name', action='store', nargs=1, dest='build_name')
这样你的语法就会变成:
python test.py build --test "<random http>" --name foobar
可以试着看看 argparse#nargs
这个文档。