如何在python中使用click来运行不同脚本的命令参数来创建命令行程序?

时间:2017-04-03 07:35:59

标签: python click command-line-interface

我有以下代码:

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

在终端没有任何事情发生,当我认为某些东西应该打印时,没有什么东西可以打印出来,即“初始化数据库”'回声。我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

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()