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())来控制程序的退出行为
相关推荐
前程的前程也迷茫1 分钟前
flask程序线程问题
python·flask
m0_748250032 分钟前
前端pdf预览方案
前端·pdf·状态模式
neeef_se2 分钟前
【Linux】WG-Easy:基于 Docker 和 Web 面板的异地组网
linux·前端·docker
博雅智信13 分钟前
人工智能-自动驾驶领域
人工智能·python·深度学习·yolo·机器学习·计算机视觉·自动驾驶
数据龙傲天19 分钟前
大数据时代下的电商API接口创新应用
爬虫·python·数据分析·api
stormsha20 分钟前
解决 npm 安装慢的问题:加速 npm 包下载的实用方法
前端·npm·node.js
我命由我1234523 分钟前
15.Java 网络编程(网络相关概念、InetAddress、NetworkInterface、TCP 网络通信、UDP 网络通信、超时中断)
java·开发语言·网络·后端·tcp/ip·udp·java-ee
lulu_063224 分钟前
safari 浏览器输入框 focus时不显示那一闪一闪的图标
前端·css·vue·safari·element-plus
sunshine__sun25 分钟前
自动化测试报错:Exception managing chrome: error decoding response body
java·前端·chrome
m0_7482352432 分钟前
前端:HTML、CSS、JS、Vue
前端·javascript·html