快速启动

您可以直接从pypi获取库:

pip install click

安装到 虚拟现实 强烈推荐。

虚拟现实

virtualenv可能是您希望用于开发点击应用程序的工具。

virtualenv解决了什么问题?除了您的点击脚本,您可能还想将它用于其他项目。但是项目越多,就越有可能使用不同版本的python本身,或者至少使用不同版本的python库。让我们面对现实:库经常会破坏向后兼容性,而且任何重要的应用程序都不太可能具有零依赖性。那么,如果您的两个或多个项目具有冲突的依赖关系,您该怎么做呢?

Virtualenv出手相救!Virtualenv支持多个并行安装的Python,每个项目一个。它实际上并不安装单独的Python副本,但它确实提供了一种巧妙的方法来隔离不同的项目环境。

创建您的项目文件夹,然后在其中创建一个虚拟文件夹::

$ mkdir myproject
$ cd myproject
$ python3 -m venv .venv

现在,只要您想处理一个项目,就只需要激活相应的环境。在OS X和Linux上,执行以下操作:

$ . .venv/bin/activate
(venv) $

如果您是Windows用户,则以下命令适用于您:

> .venv\scripts\activate
(venv) >

无论采用哪种方式,您现在都应该使用virtualenv(注意shell的提示是如何更改以显示活动环境的)。

如果要停止使用Virtualenv,请使用以下命令:

$ deactivate

这样做之后,您的shell提示应该和以前一样熟悉。

现在,我们继续。输入以下命令以在virtualenv中激活click::

$ pip install click

几秒钟后,你就可以走了。

屏幕放映和示例

提供了一个屏幕广播,显示了click的基本API以及如何用它构建简单的应用程序。它还探讨了如何使用子命令构建命令。

单击应用程序的示例可以在文档中找到,也可以在Github存储库中找到,其中包括自述文件:

基本概念-创建命令

单击基于通过修饰符声明命令。在内部,高级用例有一个非修饰接口,但不鼓励高级使用。

通过将函数修饰为单击命令行工具 click.command() . 最简单的是,用这个修饰器修饰一个函数就可以使它成为一个可调用的脚本:

import click

@click.command()
def hello():
    click.echo('Hello World!')

发生的是,修饰符将函数转换为 Command 然后可以调用它:

if __name__ == '__main__':
    hello()

看起来像是:

$ python hello.py
Hello World!

以及相应的帮助页面:

$ python hello.py --help
Usage: hello.py [OPTIONS]

Options:
  --help  Show this message and exit.

回响

为什么这个例子使用 echo() 而不是普通的 print() 功能?这个问题的答案是Click试图始终如一地支持不同的环境,并且即使在环境配置错误的情况下也非常健壮。Click希望至少在一个基本的层次上具有功能性,即使一切都被完全破坏了。

这意味着 echo() 函数在终端配置错误的情况下应用一些纠错,而不是死于 UnicodeError

ECHO功能还支持输出中的颜色和其他样式。如果输出流是文件,它将自动删除样式。在Windows上,Colorama会自动安装和使用。看见 ANSI颜色

如果不需要,也可以使用 print() 结构/功能。

嵌套命令

命令可以附加到其他类型的命令 Group . 这允许任意嵌套脚本。例如,下面的脚本实现了两个用于管理数据库的命令:

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

如你所见, group() 装饰工的工作方式 command() 但创建了一个 Group 对象,它可以被赋予可以附加的多个子命令 Group.add_command() .

对于简单的脚本,还可以使用 Group.command() 改为装饰。上面的脚本可以这样编写:

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

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

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

然后您将调用 Group 在您的入口点或其他调用中:

if __name__ == '__main__':
    cli()

稍后注册命令

而不是使用 @group.command() 装饰器,命令可以用素色装饰 @click.command() 装潢师,后来在一个小组注册 group.add_command() . 这可以用于将命令拆分为多个Python模块。

@click.command()
def greet():
    click.echo("Hello, World!")
@click.group()
def group():
    pass

group.add_command(greet)

添加参数

要添加参数,请使用 option()argument() 装饰者:

@click.command()
@click.option('--count', default=1, help='number of greetings')
@click.argument('name')
def hello(count, name):
    for x in range(count):
        click.echo(f"Hello {name}!")

它是什么样子的:

$ python hello.py --help
Usage: hello.py [OPTIONS] NAME

Options:
  --count INTEGER  number of greetings
  --help           Show this message and exit.

切换到入口点

在您到目前为止编写的代码中,文件末尾有一个块,如下所示: if __name__ == '__main__': 。这是传统上独立的Python文件的外观。有了Click,你可以继续这样做,但更好的方法是将你的应用程序打包成一个入口点。

有两个主要(以及更多)原因:

第一个是安装程序会自动为Windows生成可执行包装,因此您的命令行实用程序也可以在Windows上运行。

第二个原因是,入口点脚本可以在Unix上与Virtualenv一起工作,而不必激活Virtualenv。这是一个非常有用的概念,它允许您将脚本与所有需求捆绑到一个虚拟环境中。

Click可以很好地处理这一点,事实上,文档的其余部分将假定您正在将应用程序编写为分布式包。

看看这个 包装入口点 在阅读其余章节之前,示例假定您将使用入口点。