gpt4 book ai didi

python - 在单个命令行中多次调用相同的子命令

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

我正在尝试弄清楚如何使用 argparser 来执行以下操作:

$ python test.py executeBuild --name foobar1 executeBuild --name foobar2 ....

getBuild 本身是一个子命令。我的目标是让脚本能够链接一系列子命令(executeBuild 是其中之一)并按顺序执行它们。在上面的示例中,它将执行构建,然后设置环境,然后再次执行构建。我怎样才能用 argparse 完成这个?我尝试了以下方法:

    main_parser = argparse.ArgumentParser(description='main commands')
subparsers = main_parser.add_subparsers(help='SubCommands', dest='command')

build_parser = subparsers.add_parser('executeBuild')
build_parser.add_argument('--name', action='store', nargs=1, dest='build_name')
check_parser = subparsers.add_parser('setupEnv')

args, extra=main_parser.parse_known_args()

但是,似乎每当我这样做时,它都会进入 executeBuild 的子命令并报告它不知道 executeBuild 是什么。我已经尝试解析出额外的部分,以便我可以重复调用/链,但是,第一个 View 属性似乎已被覆盖,所以我什至不能只保存额外的选项并进行迭代。

最佳答案

你在问 argparse 一些它不是为之编写的东西:它擅长解析一个命令行(但只有一个),而你想在一行中解析多个命令。恕我直言,您必须对参数数组进行初始拆分,然后在每个子命令上使用 argparse。以下函数采用参数列表(可以是 sys.argv),跳过第一个并拆分数组中从每个已知子命令开始的剩余部分。然后您可以在每个子列表上使用 argparse :

def parse(args, subcommands):
cmds = []
cmd = None
for arg in args[1:]:
if arg in (subcommands):
if cmd is not None:
cmds.append(cmd)
cmd = [arg]
else:
cmd.append(arg)
cmds.append(cmd)
return cmds

在你的例子中:

parse(['test.py', 'executeBuild', '--name', 'foobar1', 'executeBuild', '--name', 'foobar2'],
('executeBuild',))

=>

[['executeBuild', '--name', 'foobar1'], ['executeBuild', '--name', 'foobar2']]

限制:子命令用作保留字,不能用作选项参数。

关于python - 在单个命令行中多次调用相同的子命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24484035/

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