click包其实是一个命令行执行的包,也是现在项目脚本执行的时候需要的,所以简单的做个总结
单个命令行函数
python
# test.py
import click
@click.command()
@click.option('-v', 'version', help='现实版本')
def version(version):
click.echo(version)
if __name__ == '__main__':
version()
# 我们可以执行这个py文件,使用命令:
python test.py -v 123
就可以看到 123被打印出来,就是执行了click.echo(version),把version这个参数打印了,这是一个命令行参数
@click.option
参数的一些常用属性:
param_decls
: 参数声明,可以是一个或多个字符串,通常是选项名称前缀,例如-v
或--verbose
。default
: 如果用户没有提供值,则使用的默认值。callback
: 一个可调用对象,当解析此选项时将被调用。help
: 提供给用户帮助文本,通常会在使用--help
选项时显示。type
: 指定选项应接受的值类型,例如click.INT
、click.STRING
等。required
: 布尔值,表明是否需要此选项。如果设置为True
,则必须提供此选项。multiple
: 布尔值,如果设置为True
,则允许用户提供多个值。is_flag
: 布尔值,如果设置为True
,则表示这是一个布尔标志,而不是值选项。flag_value
: 当is_flag=True
时,提供给内部处理的值。count
: 布尔值,如果设置为True
,则每次出现选项都会增加计数。prompt
: 如果设置,当从命令行未提供值时提示用户输入。confirmation_prompt
: 布尔值,如果设置为True
,则会要求用户确认他们的输入。hide_input
: 布尔值,如果设置为True
,则隐藏用户的输入(对于密码等敏感信息有用)。show_default
: 布尔值,如果设置为True
,则在帮助信息中显示默认值。nargs
: 整数,指定选项应该消耗多少个命令行参数
我们简单试一下一些参数,比如defult这个参数:当我们用来解析文件的时候,可以给一个默认解析的文件如下:
python
import click
@click.command()
@click.option('-o', '--output', help='解析json文件', default='a.json')
def read_json(output):
if output == 'a.json':
click.echo(f'没有传入json文件,使用默认的{output}')
else:
click.echo(f'{output}')
if __name__ == '__main__':
read_json()
# 我们执行命令:
1命令:python test.py 打印结果:没有传入json文件,使用默认的a.json
2命令:python .\test.py -o b.json 打印结果:b.json
这样就可以实现根据是否传入参数做不通的处理
多个命令行函数
这个时候我们就有一个主函数,然后可以多个子函数,如下写法:
python
import click
@click.group()
@click.option('-n', '--number', help='数字')
@click.pass_context
def main(ctx, number):
"""主命令,用于管理多个子命令"""
ctx.ensure_object(dict)
ctx.obj['number'] = number
if number:
click.echo('版本 1.0.0')
@main.command()
@click.option('-o', '--output', help='输出文件路径')
@click.pass_context
def output(ctx, output):
"""处理输入文件并生成指定格式的输出"""
click.echo(ctx.obj['number'])
click.echo(f'保存到: {output}')
main.add_command(output)
if __name__ == '__main__':
main()
这样执行会有一些区别,如果我们只执行main主函数,那么会报错:
python test.py --number 123
Usage: test.py [OPTIONS] COMMAND [ARGS]...
Try 'test.py --help' for help.
Error: Missing command.
我们想要正确的执行,必须主函数搭配一个子函数来执行如下:
正确执行:python test.py --number 123 output -o a.json
版本 1.0.0
123
保存到: a.json
关于函数的名字,还有要特殊注意一定如下:
python
import click
@click.group()
@click.option('-n', '--number', help='数字')
@click.pass_context
def main(ctx, number):
"""主命令,用于管理多个子命令"""
ctx.ensure_object(dict)
ctx.obj['number'] = number
@main.command()
@click.option('-i', '--input', help='输入文件路径')
@click.pass_context
def input_json(ctx, input):
"""处理输入文件并生成指定格式的输出"""
click.echo(ctx.obj['number'])
click.echo(f'输入: {input}')
main.add_command(intput_json)
if __name__ == '__main__':
main()
按照正常的,我们知道想要执行子函数写上子函数的函数名跟上参数就可以了,但是我们实际执行会发现报错了:
python test.py --number 123 input_json -i a.json
Usage: test.py [OPTIONS] COMMAND [ARGS]...
Try 'test.py --help' for help.
Error: No such command 'input_json'.
告诉我们并没有input_json这个命令,正确的写法应该是这样的
python test.py --number 123 input-json -i a.json
版本 1.0.0
123
输入: a.json
他在底层会转换如果我们的函数名中有_这样的,我们在执行的时候就要把下划线替换成-这样的,才能真正的找到该函数执行
关于装饰器
@click.pass_context
@click.pass_context
是 click
库中的一个装饰器,用于将当前的上下文对象(Context
)传递给命令函数。上下文对象包含了很多有用的信息,比如命令行参数、子命令链、默认值以及其他在命令执行过程中可以共享的数据。
主要用途
-
访问上下文信息:
- 你可以通过上下文对象访问命令行参数、配置和其他在不同命令之间共享的数据。
-
传递数据:
- 上下文对象可以在多个命令和回调之间传递数据,特别是在主命令和子命令之间共享状态或配置。
-
调用其他命令:
- 你可以使用上下文对象来调用其他的命令或子命令,这在某些复杂的CLI应用中非常有用。
-
控制程序流:
- 你可以使用上下文对象的方法(如
exit()
)来控制程序的退出行为
- 你可以使用上下文对象的方法(如