具有常用选项的Python多命令CLI

问题描述 投票:0回答:1

我正在为我的Python应用程序添加CLI。 CLI应该允许一次运行多个命令。这些命令应具有通用选项和个人选项。

示例

$ python mycliapp.py --common-option1 value1 --common-option2 value2 cmd1 --cmd1-option cmd2 --cmd2-option somevalue cmd3

该示例具有所有命令使用的两个公共选项,每个命令只能具有或不具有该命令使用的选项。

我已经考虑过Python Click。它具有丰富的功能,但没有一些主命令,它不允许(至少我没有找到)使用常用选项。

上面的示例在单击时看起来如下

$ python mycliapp.py maincmd --common-option1 value1 --common-option2 value2 cmd1 --cmd1-option cmd2 --cmd2-option somevalue cmd3

[也被视为Python Argparse。看起来它可以满足我的需要,并且我设法编写了一个代码,该代码可与常用选项和单个命令一起使用,但无法管理多个命令。此页面Python argparse - Add argument to multiple subparsers有一个很好的示例,但似乎command2应该是command1的子命令。这有点不同,因为我需要命令可以以任何顺序执行。

python command-line-interface argparse python-click
1个回答
0
投票

Click完全支持这种语法。一个简单的示例如下所示:

import click


@click.group(chain=True)
@click.option('--common-option1')
@click.option('--common-option2')
def main(common_option1, common_option2):
    pass


@main.command()
@click.option('--cmd1-option', is_flag=True)
def cmd1(cmd1_option):
    pass


@main.command()
@click.option('--cmd2-option')
def cmd2(cmd2_option):
    pass


@main.command()
def cmd3():
    pass


if __name__ == '__main__':
    main()

假设上面是mycliapp.py,我们将看到常见的帮助输出:

$ python example.py --help
Usage: example.py [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]...

Options:
  --common-option1 TEXT
  --common-option2 TEXT
  --help                 Show this message and exit.

Commands:
  cmd1
  cmd2
  cmd3

对于cmd1

$ python mycliapp.py cmd1 --help
Usage: mycliapp.py cmd1 [OPTIONS]

Options:
  --cmd1-option
  --help         Show this message and exit.

对于cmd2

$ python mycliapp.py cmd2 --help
Usage: mycliapp.py cmd2 [OPTIONS]

Options:
  --cmd2-option TEXT
  --help              Show this message and exit.

这样,我们可以从您的问题中运行命令行:

python mycliapp.py --common-option1 value1 --common-option2 value2 cmd1 \
  --cmd1-option cmd2 --cmd2-option somevalue cmd3
© www.soinside.com 2019 - 2024. All rights reserved.