python包之click

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.INTclick.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_contextclick 库中的一个装饰器,用于将当前的上下文对象(Context)传递给命令函数。上下文对象包含了很多有用的信息,比如命令行参数、子命令链、默认值以及其他在命令执行过程中可以共享的数据。

主要用途

  1. 访问上下文信息

    • 你可以通过上下文对象访问命令行参数、配置和其他在不同命令之间共享的数据。
  2. 传递数据

    • 上下文对象可以在多个命令和回调之间传递数据,特别是在主命令和子命令之间共享状态或配置。
  3. 调用其他命令

    • 你可以使用上下文对象来调用其他的命令或子命令,这在某些复杂的CLI应用中非常有用。
  4. 控制程序流

    • 你可以使用上下文对象的方法(如 exit())来控制程序的退出行为
相关推荐
西西弗Sisyphus21 分钟前
全面掌握Python时间处理
python·time
强强学习1 小时前
HTML5 起步
前端·html·html5
小梁不秃捏2 小时前
深入浅出Java虚拟机(JVM)核心原理
java·开发语言·jvm
java1234_小锋2 小时前
一周学会Flask3 Python Web开发-http响应状态码
python·flask·flask3
念九_ysl3 小时前
前端循环全解析:JS/ES/TS 循环写法与实战示例
前端·javascript·typescript
我不是程序猿儿3 小时前
【C】识别一份嵌入式工程文件
c语言·开发语言
奔跑吧邓邓子3 小时前
【Python爬虫(12)】正则表达式:Python爬虫的进阶利刃
爬虫·python·正则表达式·进阶·高级
码界筑梦坊4 小时前
基于Flask的京东商品信息可视化分析系统的设计与实现
大数据·python·信息可视化·flask·毕业设计
软件开发技术局4 小时前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
pianmian14 小时前
python绘图之箱型图
python·信息可视化·数据分析