python click的安装(离线和联网)、click使用的三大框架
click包是基于Python编写的,最后作为Python的第三方包供使用者免费使用,Python包基本都是基于Python编写,Python包分为标准包和第三方包,也称为标准库和第三方库,标准包是安装Python时就自动安装了的,比如os/sys等,第三方包安装Python时不会自动安装,可以在使用者需要用到的时候自行安装,使用者也可以自定义自己的Python包,放入pyhton存放第三包的site-packages目录下供自己使用。
一、click简介
Click是一款优秀的命令行工具,它开发初衷就是使用最少的代码,以一种可组合的方式创建漂亮的命令行接口。它的目的是使编写命令行工具的过程快速而有趣。具体使用看下文。
核心思维:将函数调用的形式转化为命令行传参的形式
二、click安装
下面的安装方式,Windows和Linux系统下都可以如此安装。
1、使用pip联网安装
pip install click
使用此命令安装click很方便,前提时你的电脑需要联网。
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple click
如果发现pip install click安装不成功,也可以在国内开源软件镜像网站下载,这样下载会比较快。
国内开源软件镜像网站有很多:
豆瓣 http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
阿里云 http://mirrors.aliyun.com/pypi/simple/
2、离线安装
先下载click离线包,离线包可以到上面的镜像源中下载。
安装whl包: pip install **.whl(前提是要安装好pip和wheel)
安装tar.gz包:cd到解压后路径,python setup.py install
三、click使用三大框架
click使用很简单,分以下五步,即可实现click基本框架。
(1)导入click;
(2)使用 @click.command() 装饰函数,使之成为命令行接口;
(3)使用 @click.option() 和@click.agrument(),为函数添加命令行选项、参数;
(4)定义需要被装饰的函数;
(5)调用被装饰的函数。
import click
@click.command()
@click.option("--name",required=True)
def add(name):
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
因为click已经装饰过add()函数并且为其添加的参数,所以在调用的时候不需要重复传参了。执行结果如下:
1、框架一:使用click.comand装饰单个命令
这就是上面提到的基本框架。
2、框架二:使用click.group装饰多命令
import click
@click.group()
def main():
pass
@click.command()
@click.option("--name",required=True)
def add(name):
click.echo(f"add user {name}")
@click.command()
@click.option("--name",required=True)
def delete(name):
click.echo(f"delete user {name}")
main.add_command(add)
main.add_command(delete)
if __name__ == "__main__":
main()
直接上执行结果:
直接输入程序名,不带任何参数和子命令,效果和--help参数的效果是一样的,显示命令的使用方式、命令参数以及子命令。
每个子命令都是相互独立的,形成了一对多的“命令-子命令”模式。
3、使用click.multicommand自定义多命令
import click
class Custom(click.MultiCommand):
def list_commands(self, ctx):
...
def get_command(self, ctx, cmd_name):
...
@click.command(CLI=Custom)
@click.option(...)
@click.pass_context
def main():
...
自定义多命令时需要自定义一个class(这里是指Custom),继承MultiCommand类,重写父类MultiCommand的list_commands()和get_command()的方法,实现自己的命令列表。需要注意的是,Python中重写父类方法的规则:重写父类方法时必须与父类方法名相同、参数一致、返回值类型相同。如果有一项不相同,只能认为是子类新增了一个方法,而并没有重写父类的方法,当click框架调用方法时,依然调用的是父类的方法。
这里list_commands()方法的作用是列出该命令的所有子命令,如下:
如果不重写list_commands()或者把该方法名写成list_command(),此时click框架调用list_commands()时调用的是父类MultiCommand的方法,此时是无法获取你自定义的子命令列表的。
get_command()的方法,是用来获取命令行中输入的子命令,并且跳转去执行对应的子命令。如果不重写的话,会直接报错。
四、Python中click包讲解
click包是Python的第三方包,安装Python时一般默认会安装在C:\Program Files\下,安装click包则会默认安装在C:\Program Files\Python37\Lib\site-packages目录下,如图:
site-packages目录下一般存放着Python安装的第三方包,打开click包,有以下文件:
在我们开始编写Python程序前import click,其实import 的是__init__.py里面的内容,这里只截取了一部分,如果想了解可以打开自己系统上安装的Python里面的click包查看。
上面三大框架中出现的Multicommand、option、group、pass_context等__init__.py中都有显示,而click包中的其他py文件都是这些类、方法、变量的定义,如果想更深入的了解click的工作机制,可以具体去看代码。
此处可以看看MultiCommand类定义的方法和变量,最后两个方法list_commands()和get_command()就是第三大框架中提到的需要重写的方法。