click通过click.command()装饰函数,使之成为命令行接口;通过click.option()装饰函数,为其约束并添加命令行选项和参数。简化了传统加参的方式,减少了开发者编写的代码量,使命令行工具编写起来快速而有趣。
新建一个名为adduser.py的Python文件,寥寥几行代码已经实现了一个完整命令行工具。
import click
@click.command()
@click.option("--name",required=True)
def add(name):
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
首先定义了一个add()函数,通过click.command()将add()函数装饰成一个命令接口,这样可以直接在命令行上通过“python 文件名.py ”的形式直接调用add()函数,再通过click.option()为add()函数添加选项“--name”,此选项即可通过命令行输入的形式传给add()函数。
一、click.option中参数的修饰字段汇总
1.required
click.option()函数中有个required字段,当required=True时表示这个选项在命令行输入参数时必须带上,否则会报错。当required=False时,表示此参数可带可不带。
如果将required=False,则命令是可以执行成功的。
import click
@click.command()
@click.option('-n',"--name",required=False)
def add(name):
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
click.option()还有许多其他参数字段,用来限制或者扩展选项,以满足开发者的需要。
2.default
为当前的选项添加default值。即使此时required=True,命令行也可以不输入参数值,如果命令行不输入参数值表示此时输入的是默认值。
import click
@click.command()
@click.option("--name",required=True,default="golden")
def add(name):
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
3.nargs
指定命令行参数接收的值的个数,等于-1表示接受参数不限
import click
@click.command()
@click.option("--name",required=True,nargs=2)
def add(name):
print(name)
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
4.type
指定输入选项对应的参数的数据类型,未指定时默认是str字符串类型。
import click
@click.command()
@click.option("--name",required=True)
#@click.option("--name",required=True,type=str) #等同于上一句
def add(name):
print(type(name)) #打印输入参数name的数据类型
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
4.1 type字段对应的数据类型
str / click.STRING | 表示字符串类型,这也是默认类型 |
int / click.INT | 表示整型 |
float / click.FLOAT | 表示浮点型 |
bool / click.BOOL | 表示布尔型。对于 1、yes、y 和 true 会转化为 True;0、no、n 和 false 会转化为 False |
click.UUID | 表示 UUID,会自动将参数转换为 uuid.UUID 对象 |
click.FILE | 表示文件,会自动将参数转换为文件对象,并在命令行结束时自动关闭文件 |
click.PATH | 表示路径 |
click.IntRange | 表示范围选项 |
click.Choice | 限定参数值 @click.option('-c',required=True,type=click.Choice(['start','stop']))
|
5.multiple
multiple=True,使用多个相同地位选项分别指定值
import click
@click.command()
@click.option("-N","-n","--name",required=True,type=str,multiple=True)
def add(name):
print(name)
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
三个选项地位相同,使用的时候可以三选一,可以解决某些要求选项不区分大小写的情况。输入的参数值是以元组的形式传入函数中。
6.prompt
当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入。一般用于密码验证。prompt=True表示接受用户输入,hide_input=True表示隐藏输入的内容,confirmation_prompt=True表示再次确认输入的内容。当然也可以直接在命令行中输入。
import click
@click.command()
@click.option("--name",required=True,type=str)
@click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)
#@click.password_option() #作用同上句一样,是click对上句的封装
def add(name,password):
print(name,password)
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
7.is_eager、is_eager、callback,is_flag
Click 提供 eager 标识对参数名进行标识,如果输入该参数,则会拦截既定的命令行执行流程,跳转去执行一个回调函数。
is_eager=True 表明该命令行选项优先级高于其他选项;
expose_value=False 表示如果没有输入该命令行选项时,会执行既定的命令行流程;
callback=函数名 指定了输入该命令行选项时,要跳转执行的函数;
is_flag=True 表明参数值可以省略。
这四个修饰字段一般会同时使用。
import click
def print_version(ctx, param, value):
print("this program version : 0.1")
exit()
@click.command()
@click.option("--name",required=True,type=str)
@click.option("--version",is_eager=True,expose_value=False,callback=print_version,is_flag=True)
def add(name):
print(name)
click.echo(f"add user {name}")
if __name__ == "__main__":
add()
is_eager=True表示--version的优先级高于其他选项比如--name,当命令行同时出现这两个参数时,会优先执行--version。
is_flag=True表示该选项的参数值可以省略,就算加上也没有意义
expose_value=False表示命令行中没有出现--version选项时,会执行click既定的命令流程
callback=print_version,表示当命令行中出现--version时,不在执行click既定的命令流程,转而执行print_version()函数。
二、click.argument()
click.argument()比click.option()用法简单很多,也是用来修饰函数为其添加参数的。不同的是argument()只是添加参数,不添加选项。上面option()中用到的修饰字段也可以用于argument()。
import click
@click.command()
#@click.option("--name",required=True,type=str)
@click.argument("name")
def add(name):
click.echo(f"add user {name}")
if __name__ == "__main__":
add()