【Python 第三方库】click

2024-01-25 00:00:00

目录:

click 模块介绍

click 用于快速创建命令行工具,通过直观的装饰器语法,将参数定义与业务逻辑处理紧密绑定,使得开发者能够以最少的代码量构建出专业、交互友好的命令行工具。

安装依赖:

$ pip install click -i https://pypi.tuna.tsinghua.edu.cn/simple

@click.command()

任何函数只需加上 @click.command() 装饰器,即可变成一个命令行命令。

# test.py
import click

@click.command()
def hello():
    """这是一个简单的 Hello World 命令行工具"""
    click.echo("Hello, Click!")

if __name__ == '__main__':
    hello()

运行命令 $ python test.py --help 可以查看自动生成的帮助文档。

@click.option()

选项是以 -- 开头的命令行参数,通常用于可选的配置。使用 @click.option() 装饰器定义。

# test.py
import click

@click.command()
@click.option('--count', default=1, help='问候的次数。')
@click.option('--name', prompt='请输入您的名字', help='要问候的人。')
def greet(count, name):
    """一个简单的问候程序。"""
    for _ in range(count):
        click.echo(f"Hello, {name}!")

if __name__ == '__main__':
    greet()

测试:

$ python test.py --help
Usage: test.py [OPTIONS]

  一个简单的问候程序。

Options:
  --count INTEGER  问候的次数。
  --name TEXT      要问候的人。
  --help           Show this message and exit.

$ python test.py --count 2 --name dkvirus 
Hello, dkvirus!
Hello, dkvirus!

@click.argument()

参数是不带 -- 前缀的位置参数,通常用于命令的核心操作对象(如文件名)。使用 @click.argument() 装饰器定义,且通常为必填项。

# test.py
import click

@click.command()
@click.argument('filename')
@click.option('--mode', default='read', help='处理模式:read 或 write。')
def process_file(filename, mode):
    """处理指定的文件。"""
    click.echo(f"正在以 '{mode}' 模式处理文件: {filename}")

if __name__ == '__main__':
    process_file()

测试:

$ python test.py --help
Usage: test.py [OPTIONS] FILENAME

  处理指定的文件。

Options:
  --mode TEXT  处理模式:read 或 write。
  --help       Show this message and exit.

$ python test.py data.json --mode read
正在以 'read' 模式处理文件: data.json

数值参数大小限制

如下示例: 验证 age(年龄)必须在1-120之间。

# test.py
import click

@click.command()
@click.option('--age', type=click.IntRange(1, 120), help='年龄必须在1到120之间。')
def register(age):
    click.echo(f"年龄 {age}。")

if __name__ == '__main__':
    register()

测试:

$ python test.py --age 200
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.

Error: Invalid value for '--age': 200 is not in the range 1<=x<=120.

$ python test.py --age 18
年龄 18。

预定值参数

如下示例: gender(性别)必须是 man 或者 woman,填其它的会报错。

# test.py
import click

@click.command()
@click.option('--gender', type=click.Choice(['man', 'woman'], case_sensitive=False))
def register(gender):
    click.echo(f"性别 {gender}。")

if __name__ == '__main__':
    register()

测试:

$ python test.py --gender men
Usage: test.py [OPTIONS]
Try 'test.py --help' for help.

Error: Invalid value for '--gender': 'men' is not one of 'man', 'woman'.

$ python test.py --gender man
注册信息:年龄 None,性别 man。

多个参数值

通过 nargs 参数,一个选项可以接收多个值,如下示例,center 选项的参数值必须是 2 个。

# test.py
import click

@click.command()
@click.option('--center', nargs=2, type=float, help='圆心坐标 (x y)。')
def draw(center):
    click.echo(f"正在绘制圆心为 {center} 的圆...")
    # 绘图逻辑...

if __name__ == '__main__':
    draw()

测试:

$ python test.py --center 1 2
正在绘制圆心为 (1.0, 2.0) 的圆...

布尔值参数

通过 is_flag=True 可以定义布尔标志。

# test.py
import click

@click.command()
@click.option('--verbose', '-v', is_flag=True, help='开启详细输出模式。')
def draw(verbose):
    if verbose:
        click.echo(f"输出详细内容")
    else:
        click.echo("不输出详细内容")

if __name__ == '__main__':
    draw()

测试:

$ python test.py
不输出详细内容

$ python test.py --verbose
输出详细内容

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: