我正在为我的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的子命令。这有点不同,因为我需要命令可以以任何顺序执行。
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