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

时间:2016-01-08 16:34:39

标签: python argparse

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

mycommand read <path>

mycommand write <path> <value>

不使用<path><value>参数的标签,即不需要--path。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

根据文档,这是非常直接的:

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与处理函数一起使用可能会在{{1过时的。