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())来控制程序的退出行为
相关推荐
橙子家14 小时前
浏览器缓存之【基础键值存储】:Local storage 和 Session storage
前端
程序员龙叔16 小时前
编写高质量 Skill 系列 -- 如何设计需求分析与用例生成的 SKILL
自动化测试·软件测试·python·软件测试工程师·接口测试·性能测试·skill·ai测试
星星在线17 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒17 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x18 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
京东云开发者18 小时前
京东市民服务又“上新”!这次是黑龙江“龙易办”
前端
袋鱼不重19 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户83562907805119 小时前
使用 Python 操作 Word 内容控件
后端·python
LDR00619 小时前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术19 小时前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript