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

标签 python argparse

我想创建一个命令解析器mycommand ,使用argparse ,有两个子命令 readwrite :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/

相关文章:

python - argparse:如何允许多个值覆盖默认值

python-3.x - 如何在终端中删除给定的args并在argparse中添加自己的args

python - 使用 argparse 调用函数

python - 如何在没有 .py 扩展名的情况下运行 argparse python 程序?

Python:Got\xa0 而不是 CSV 中的空格,无法删除或转换

python - GroupBy 总和作为开始和结束日期范围的比例

python - ipython事后调试: scope of outer function

python - 在matplotlib中获取颜色图的长度

python - 了解 Python 进程的内存增长(VmRSS 与 gc.get_objects)

python - 自定义 argparse 帮助消息