我想创建一个命令解析器mycommand
,使用argparse
,有两个子命令 read
和write
:read
应该只有一个参数,即某个路径,并且 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
上的该属性已过时。
关于Python argparse - 创建没有标签的子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681808/