gpt4 book ai didi

Python argparse,运行一个或多个子命令

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:10 24 4
gpt4 key购买 nike

我正在尝试编写一个能够执行多个子命令的程序。 argparse 模块非常有用,但我认为它缺乏指定多个子命令的能力。例如,如果我有以下代码:

parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers()

subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument('--opt1', help='option 1 help')
subcommand_a.add_argument('--opt2', nargs='+', help='option 2 help')

subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument('--opt1', help='option 1 help')
subcommand_b.add_argument('--opt2', help='option 2 help')
subcommand_b.add_argument('--opt3', nargs='+', help='option 3 help')

parser.parse_args()

我不能在命令行上同时指定 subcommand_a 和 subcommand_b。我一次只能做其中一个。我想这将需要一个自定义操作,甚至可能需要对 argparse 进行子类化,但我不确定从哪里开始。我希望能够像下面这样调用这个程序:

./prog.py subcommand_a FOO --opt1=bar --opt2 1 2 3 -- subcommand_b BAR --opt1='foo' --opt3 a b c --

有什么想法吗?

最佳答案

你的问题和几个月前问的基本一样

Multiple invocation of the same subcommand in a single command line

那个人想多次调用同一个子命令,但问题是一样的 - 如何处理多个 subparsers 参数。

那里的解决方案是在将命令行分成单独解析的片段之前将其拆分,或者从一次解析中收集“未使用”的片段以供在第二或第三次使用。

这里是对返回 2 个命令的代码的调整:

import argparse
parser = argparse.ArgumentParser(prog='My Prog')
sub_parsers = parser.add_subparsers(dest='cmd')

subcommand_a = sub_parsers.add_parser('subcommand_a', help='a help')
subcommand_a.add_argument('req1', help='required argument 1 help')
subcommand_a.add_argument('--opt1', help='option 1 help')
subcommand_a.add_argument('--opt2', nargs=3, help='option 2 help')

subcommand_b = sub_parsers.add_parser('subcommand_b', help='b help')
subcommand_b.add_argument('req1', help='required argument 1 help')
subcommand_b.add_argument('--opt1', help='option 1 help')
subcommand_b.add_argument('--opt2', help='option 2 help')
subcommand_b.add_argument('--opt3', nargs=3, help='option 3 help')

argv = "subcommand_a FOO --opt1=bar --opt2 1 2 3 subcommand_b BAR --opt1=foo --opt3 a b c"
rest = argv.split()
while rest:
[args, rest] = parser.parse_known_args(rest)
print args
print rest

打印:

Namespace(cmd='subcommand_a', opt1='foo', opt2=['1', '2', '3'], req1='FOO')
['subcommand_b', 'BAR', '--opt3', 'a', 'b', 'c']
Namespace(cmd='subcommand_b', opt1=None, opt2=None, opt3=['a', 'b', 'c'], req1='BAR')
[]

我删除了 '--'(请参阅我的其他答案的末尾)

我将 opt2opt3 更改为采用 3 个参数,而不是变量 +。对于 +,它无法判断 opt2 的列表在哪里结束以及下一个命令从哪里开始。

不同的命令采用不同的选项(标志)也很重要。请注意,第一个 opt1 以第二个值“foo”结束,第二个命令没有留下任何值。有关问题和解决方法的讨论,请参阅其他线程。

关于Python argparse,运行一个或多个子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318622/

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