Python 使用“单击”创建复杂的命令行界面

Python 使用“单击”创建复杂的命令行界面,python,command-line-interface,python-click,Python,Command Line Interface,Python Click,我正在尝试做一个CLI,它接受多个参数,我猜您会说这些参数是嵌套的并且是预定义的。例如,假设我正在尝试创建一个管理关系数据库的实用程序。我需要如下命令: dbmgr.py create table --name="mytab" dbmgr.py create view --name="myview" --other-opt=... dbmgr.py drop table --name=... dbmgr.py drop user --username=... 在这种情况下,有一组预定义的操

我正在尝试做一个CLI,它接受多个参数,我猜您会说这些参数是嵌套的并且是预定义的。例如,假设我正在尝试创建一个管理关系数据库的实用程序。我需要如下命令:

dbmgr.py create table --name="mytab"
dbmgr.py create view  --name="myview" --other-opt=...
dbmgr.py drop table --name=...
dbmgr.py drop user  --username=...
在这种情况下,有一组预定义的操作(“创建”、“删除”等),每个操作都有一组特定的预定义对象,每个操作都可以对这些对象进行操作。在这种情况下,“创建”操作只能接受“表”或“视图”对象


在“删除”操作的情况下,用户只能指定“表”和“用户”对象。在单击的情况下,“创建”、“表”、“视图”和“删除”只是参数吗?如果是,我如何将可以指定的内容限制为特定值?我不确定这是否是使用组、命令等的情况,如果是,如何使用?

您试图做的就是使用组、命令等的确切情况。在您的示例中,
create
drop
是组,
table
view
等。。。是命令。在我看来,这种类型的结构使Click比其他Python命令行解析库更好。它可以很好地描述这些结构

示例代码: 测试代码: 结果:
您试图做的正是的用例。在您的示例中,
create
drop
是组,
table
view
等。。。是命令。在我看来,这种类型的结构使Click比其他Python命令行解析库更好。它可以很好地描述这些结构

示例代码: 测试代码: 结果:
import click

@click.group()
def cli():
    """DB Manager CLI"""

@cli.group()
def create():
    """create objects"""

@create.command()
def table():
    click.echo('create table command')

@create.command()
def view():
    click.echo('create view command')

@cli.group()
def drop():
    """create objects"""

@drop.command()
def table():
    click.echo('drop table command')

@drop.command()
@click.option('--username')
def user(username):
    click.echo('drop user command: {}'.format(username))

if __name__ == "__main__":
    cli()
if __name__ == "__main__":
    commands = (
        'create table',
        'create view',
        'drop table',
        'drop user --username a-user',
        '--help',
        'drop --help',
        'drop user --help',
    )

    import sys, time
    time.sleep(1)
    print('Click Version: {}'.format(click.__version__))
    print('Python Version: {}'.format(sys.version))
    for cmd in commands:
        try:
            time.sleep(0.1)
            print('-----------')
            print('> ' + cmd)
            time.sleep(0.1)
            cli(cmd.split())

        except BaseException as exc:
            if str(exc) != '0' and \
                    not isinstance(exc, (click.ClickException, SystemExit)):
                raise
Click Version: 7.0
Python Version: 3.8.1 (tags/v3.8.1:1b293b6, Dec 18 2019, 22:39:24) [MSC v.1916 32 bit (Intel)]
-----------
> create table
create table command
-----------
> create view
create view command
-----------
> drop table
drop table command
-----------
> drop user --username a-user
drop user command: a-user
-----------
> --help
Usage: test.py [OPTIONS] COMMAND [ARGS]...

  DB Manager CLI

Options:
  --help  Show this message and exit.

Commands:
  create  create objects
  drop    create objects
-----------
> drop --help
Usage: test.py drop [OPTIONS] COMMAND [ARGS]...

  create objects

Options:
  --help  Show this message and exit.

Commands:
  table
  user
-----------
> drop user --help
Usage: test.py drop user [OPTIONS]

Options:
  --username TEXT
  --help           Show this message and exit.