gpt4 book ai didi

python - 如何使用 argparse 处理 CLI 子命令

转载 作者:太空狗 更新时间:2023-10-30 01:01:24 30 4
gpt4 key购买 nike

我需要实现一个命令行界面,程序在其中接受子命令。

例如,如果程序名为“foo”,CLI 将如下所示

foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>

cmd1cmd3 必须至少与它们的选项之一一起使用,并且三个 cmd* 参数始终互斥。

我正在尝试在 argparse 中使用子解析器,但目前没有成功。问题出在没有参数的 cmd2 上:

如果我尝试添加不带参数的子解析器条目,parse_args 返回的 namespace 将不包含任何信息告诉我已选择此选项(参见下面的示例)。如果我尝试将 cmd2 作为参数添加到 parser(而不是 subparser),那么 argparse 将期望跟随 cmd2 参数通过任何子解析器参数。

有没有一种简单的方法可以用 argparse 来实现?用例应该很常见……

下面是我到目前为止尝试过的更接近我需要的东西:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')

parser_2 = subparsers.add_parser(cmd2, help='...')

parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')

args = parser.parse_args()

最佳答案

首先,子解析器从不插入命名空间。在您发布的示例中,如果您尝试将脚本运行为:

$python3 test_args.py cmd1 1
Namespace(cmd1_option1='1')

其中 test_args.py 包含您提供的代码(开头是 import argparse,结尾是 print(args)) .

请注意,没有提及 cmd1 仅提及其参数。 这是设计使然

正如评论中所指出的,您可以添加将 dest 参数传递给 add_subparsers 的信息打电话。

处理这些情况的常用方法是使用 set_defaults子解析器的方法:

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')
parser_1.set_defaults(parser1=True)

parser_2 = subparsers.add_parser('cmd2', help='...')
parser_2.set_defaults(parser2=True)

parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')
parser_3.set_defaults(parser_3=True)

args = parser.parse_args()
print(args)

结果是:

$python3 test_args.py cmd1 1
Namespace(cmd1_option1='1', parser1=True)
$python3 test_args.py cmd2
Namespace(parser2=True)

在大多数情况下,不同的子解析器会以完全不同的方式处理参数。通常的模式是使用不同的函数来运行不同的命令,并使用 set_defaults 来设置 func 属性。当您解析参数时,您只需调用该可调用对象:

subparsers = parser.add_subparsers()
parser_1 = subparsers.add_parser(...)
parser_1.set_defaults(func=do_command_one)

parser_k = subparsers.add_parser(...)
parser_k.set_defaults(func=do_command_k)

args = parser.parse_args()
if args.func:
args.func(args)

关于python - 如何使用 argparse 处理 CLI 子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216875/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com