Click包学习(1)
文章目录
简介
Click是一个Python软件包,用于以可组合的方式创建漂亮的命令行界面,所需的代码更少。它是“命令行界面创建工具包”。它是高度可配置的,但具有开箱即用的明智默认值。(对后端采用Python开发的程序员很友好)。
特点:
- 命令的任意嵌套
- 自动帮助页面生成
- 支持在运行时延迟加载子命令
第一个简单示例:
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',help='The person to greet.')
#问候函数
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()
代码运行结果
$ python click1.py --count=3
Your name: tyj
Hello tyj!
Hello tyj!
Hello tyj!
$ python click1.py --help
Usage: click1.py [OPTIONS]
Simple program that greets NAME for a total of COUNT times.
Options:
--count INTEGER Number of greetings.
--name TEXT The person to greet.
--help Show this message and exit.
安装click库
pip install click
常见方案:optparse和argparse
快速入门
您可以直接从PyPI获取该库:
pip install click
强烈建议将其安装到virtualenv中。
virtualenv
您可能要使用Virtualenv开发Click应用程序。
virtualenv解决什么问题?除了单击脚本之外,您可能还希望将其用于其他项目。但是您拥有的项目越多,就越有可能使用不同版本的Python本身,或者至少使用不同版本的Python库。让我们面对现实:库经常破坏向后兼容性,而且任何严肃的应用程序不太可能具有零依赖关系。那么,如果您的两个或多个项目具有相互依赖的关系,您该怎么办?
Virtualenv进行救援!Virtualenv启用了多个并行安装的Python,每个项目一个。它实际上并没有安装单独的Python副本,但确实提供了一种使不同项目环境保持隔离的聪明方法。让我们看看virtualenv是如何工作的。
如果您使用的是Mac OS X或Linux,则以下两个命令之一可能会为您工作:
$ sudo easy_install virtualenv
甚至更好:
$ pip install virtualenv --user
其中之一可能会在您的系统上安装virtualenv。甚至在包管理器中也可以。如果您使用Ubuntu,请尝试:
$ sudo apt-get install python-virtualenv
如果您使用的是Windows(或以上方法均无效),则必须先安装 pip
。有关此的更多信息,请参阅安装pip。安装完成后,pip
从上方运行命令,但不要使用sudo前缀。
安装virtualenv后,只需启动外壳并创建自己的环境即可。我通常在以下位置创建一个项目文件夹和一个venv 文件夹:
$ mkdir myproject
$ cd myproject
$ virtualenv venv
New python executable in venv/bin/python
Installing setuptools, pip............done.
现在,无论何时要处理项目,都只需激活相应的环境。在OS X和Linux上,执行以下操作:
$ . venv/bin/activate
如果您是Windows用户,则以下命令适用于您:
$ venv\scripts\activate
无论哪种方式,您现在都应该使用virtualenv(请注意shell提示符如何更改以显示活动环境)。
如果您想回到现实世界,请使用以下命令:
$ deactivate
完成此操作后,您的shell提示应该和以前一样熟悉。
现在,让我们继续前进。输入以下命令以在您的virtualenv中激活Click:
$ pip install Click
几秒钟后,您就可以开始了。
屏幕录像和示例
提供了一个截屏视频,其中显示了Click的基本API以及如何使用它构建简单的应用程序。它还探讨了如何使用子命令构建命令。
可在文档以及GitHub存储库中找到Click应用程序的示例以及自述文件:
inout
:文件输入和输出naval
:docopt海军示例端口aliases
:命令别名示例repo
:类似于Git / Mercurial的命令行界面complex
:插件加载的复杂示例validation
:自定义参数验证示例colors
:Colorama ANSI颜色支持termui
:终端UI功能演示imagepipe
:多命令链接演示
基本概念-创建命令
单击基于通过装饰器声明命令。在内部,对于高级用例有一个非装饰器接口,但不建议用于高级用法。
通过将功能进行修饰,该功能将成为Click命令行工具 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尝试以相同的方式同时支持Python 2和Python 3,并且即使环境配置错误也要非常健壮。即使一切都被破坏,Click至少也要在基本水平上起作用。
这意味着该echo()
功能会在终端配置错误而不是死于的情况下进行一些错误纠正 UnicodeError
。
从Click 2.0开始,附加的好处是echo函数还对ANSI颜色提供了良好的支持。如果输出流是文件,并且如果支持colorama,它将自动剥离ANSI代码,而ANSI颜色也将在Windows上运行。请注意,在Python 2中,该echo()
函数不会解析字节数组中的颜色代码信息。有关 更多信息,请参见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
在setuptools入口点中调用或其他调用:
if __name__ == '__main__':
cli()
添加参数
要添加参数,请使用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('Hello %s!' % name)
看起来像什么:
$ python hello.py --help
Usage: hello.py [OPTIONS] NAME
Options:
--count INTEGER number of greetings
--help Show this message and exit.
切换到setuptools
到目前为止,在您编写的代码中,文件末尾有一个块,如下所示:。传统上,这是独立Python文件的外观。使用Click,您可以继续执行此操作,但是可以通过setuptools找到更好的方法。if __name__ == '__main__':
有两个主要原因(还有更多原因):
第一个是setuptools自动为Windows生成可执行包装程序,因此您的命令行实用程序也可以在Windows上运行。
第二个原因是setuptools脚本可在Unix上与virtualenv一起使用,而无需激活virtualenv。这是一个非常有用的概念,可让您将满足所有要求的脚本捆绑到virtualenv中。
Click的功能非常强大,实际上,其余文档将假定您是通过setuptools编写应用程序的。
我强烈建议您 在阅读其余内容之前先阅读Setuptools集成一章,因为这些示例假定您将使用setuptools。
Setuptools集成
编写命令行实用程序时,建议将它们编写为通过setuptools分发的模块,而不是使用Unix shebangs。
你为什么想这么做?原因有很多:
-
传统方法的问题之一是Python解释器加载的第一个模块的名称不正确。这听起来像是一个小问题,但意义重大。
第一个模块未按其实际名称调用,但解释器将其重命名为
__main__
。尽管这是一个完全有效的名称,但它意味着如果要从该模块导入另一段代码,它将以其真实名称第二次触发导入,并且突然之间,您的代码被导入了两次。 -
并非在所有平台上都易于执行。在Linux和OS X上,您可以在文件()的开头添加注释,并且脚本的工作方式类似于可执行文件(假设已设置了可执行位)。但是,这在Windows上不起作用。在Windows上,您可以将解释器与文件扩展名关联(例如,使所有文件的结尾都通过Python解释器执行),如果您想在virtualenv中使用脚本,则会遇到问题。
#!/usr/bin/env python``.py
实际上,在OS X和Linux中,在virtualenv中运行脚本也是一个问题。使用传统方法,您需要激活整个virtualenv,以便使用正确的Python解释器。不太用户友好。
-
仅当脚本是Python模块时,主要技巧才起作用。如果您的应用程序变得太大,并且您想开始使用软件包,则会遇到问题。
简介
要将脚本与setuptools捆绑在一起,您所需要的只是脚本在Python包和setup.py
文件中。
想象一下这个目录结构:
yourscript.py
setup.py
内容yourscript.py
:
import click
@click.command()
def cli():
""&#