在单个命令行中多次调用同一子命令

发布于 2021-01-29 14:10:08

我试图弄清楚如何使用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。我尝试解析额外的内容,以便可以执行重复调用/链,但是,第一个视图属性似乎已被覆盖,因此,我什至不能只保存额外的选项并进行遍历。

关注者
0
被浏览
112
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您在问的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']]
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看