使用argparse处理带子命令的可选参数

0 投票
1 回答
745 浏览
提问于 2025-04-18 11:36

我在创建命令行工具时遇到了一些麻烦,想要让用户可以选择性地添加测试参数。现在我已经做到了一些事情:

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 这个文档。

撰写回答