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())来控制程序的退出行为
相关推荐
明月_清风3 分钟前
SEO 完全指南:从底层原理到实战应用场景
前端·seo
默_笙13 分钟前
🚲 手写一个"Claude Code":我用 LangChain + ReAct 循环,让 AI 自己读文件、解释代码
前端·javascript
星河耀银海26 分钟前
框架结合:Vue+HTML5+AI实现智能前端应用开发
前端·vue.js·html5
等咸鱼的狸猫1 小时前
# JS 核心六大主题:闭包内存模型、原型链查找、事件流机制与 Promise / Event Loop 实现视角复盘
前端·javascript
从零开始的代码生活_1 小时前
C++ list 原理与实践:双向链表、迭代器与简化实现
开发语言·c++·后端·学习·算法·链表·list
hy.z_7771 小时前
【C语言】11. 深入理解指针1
c语言·开发语言
charlie1145141911 小时前
现代C++工程实践——WeakPtr 第二关:核心骨架与控制块
开发语言·c++
般若-波罗蜜1 小时前
MinerU高级用法,避坑指南(持续更新)
人工智能·python·语言模型·自然语言处理
袋鱼不重1 小时前
乐观锁与悲观锁:原理、选型与前后端实践
前端·后端
用户8356290780512 小时前
使用 Python 对 PDF 文档进行数字签名的方法
后端·python