我想使用mycommand
创建一个命令解析器argparse
,其中包含两个子命令read
和write
:read
应该只有一个参数一些路径,write
应该有两个参数,其中一个是路径,另一个是值。应该可以通过以下方式执行命令:
mycommand read <path>
mycommand write <path> <value>
不使用<path>
,<value>
参数的标签,即不需要--path
。我怎么能这样做?
答案 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过时的。