Python argparse - 创建没有标签的子命令

Python argparse - creating subcommands with no labels

我想创建一个命令解析器 mycommand,使用 argparse,带有两个子命令 readwriteread 应该只有一个参数这是一些路径, write 应该有两个参数,其中一个是路径,另一个是值。应该可以通过以下方式执行命令:

mycommand read <path>

mycommand write <path> <value>

不为 <path><value> 参数使用标签,即不需要 --path。我该怎么做?

按照文档,这非常简单:

import argparse

parser = argparse.ArgumentParser()

subparsers = parser.add_subparsers()

read = subparsers.add_parser('read')
read.add_argument('path')

write = subparsers.add_parser('write')
write.add_argument('path')
write.add_argument('value')

print(parser.parse_args(['read', 'foo']))
print(parser.parse_args(['write', 'foo', 'bar']))

请注意,这并没有告诉您哪个解析器解析了参数。如果需要,只需将 dest 添加到 add_subparsers 命令:

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

最后,您可以为每个子解析器添加一个默认属性,您可以使用它来执行特定于该子解析器的操作。这在文档中也有详细说明,但为了完整起见,在我们的示例中,它可能看起来像这样1:

import argparse

parser = argparse.ArgumentParser()

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

def handle_read(args):
    print('Handling read')
    print(args)
read = subparsers.add_parser('read')
read.add_argument('path')
read.set_defaults(handler=handle_read)

def handle_write(args):
    print('Handling write')
    print(args)
write = subparsers.add_parser('write')
write.add_argument('path')
write.add_argument('value')
write.set_defaults(handler=handle_write)

args = parser.parse_args()
args.handler(args)

1为了说明的目的,我也在这个例子中将 dest 添加到子解析器——可能使用 argparse 和处理函数使 args 上的该属性已过时。