如何在 python 中使用 click 创建一个命令行程序,该程序将 运行 不同脚本的命令参数分开?

How do I make a command line program using click in python that takes separates command parameters that run different scripts?

我有以下代码:

import click

@click.group()
def cli():
    pass

@click.command()
def initdb():
    click.echo('Initialized the database')

@click.command()
def dropdb():
    click.echo('Dropped the database')

cli.add_command(initdb)
cli.add_command(dropdb)

在命令行我希望能够执行如下操作:

python clicktest.py cli initdb

并在终端发生以下回显:

Initialized the database

或进入终端:

python clicktest.py cli dropdb

并在终端上发生以下情况:

Dropped the database

我目前的问题是当我在终端执行此操作时:

 python clicktest.py cli initdb

终端没有任何反应,当我认为应该有什么东西时没有打印,即 'Initialized Database' 回显。我做错了什么??

首先,您应该在命令行中使用它,例如:

python clicktest.py initdb
python clicktest.py dropdb

然后在您的 clicktest.py 文件中,将这些行放在代码的底部:

if __name__ == '__main__':
    cli()

除非,您的代码无法正常工作。

编辑:

如果你真的想以python clicktest.py cli initdb的方式使用它,那么你还有另一种选择:

@click.group()
def main():
    pass

@click.group()
def cli():
    pass

@click.command()
def initdb():
    click.echo('Initialized the database')

@click.command()
def dropdb():
    click.echo('Dropped the database')

cli.add_command(initdb)
cli.add_command(dropdb)
main.add_command(cli)

if __name__ == '__main__':
    main()

甚至更好(改用装饰器):

@click.group()
def main():
    pass

@main.group()
def cli():
    pass

@cli.command()
def initdb():
    click.echo('Initialized the database')

@cli.command()
def dropdb():
    click.echo('Dropped the database')

if __name__ == '__main__':
    main()