命令行模块——click(一)

今天要重点介绍我们的新朋友click!!!!!关于这块知识做一个详细的梳理,以备今后使用。开始喽!

1.导入

click模块是Python的一个第三方库,用于创建命令行界面(CLI)的第三方库。它旨在让开发者能够轻松编写可读性强、易于理解和易于维护的命令行应用程序。使用前需要安装click包,安装命令:pip install clickconda install click导入模块:import click

2.基本使用

  • 使用@click.command()@click.option()装饰器定义命令参数
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name', help='The person to greet.')
def hello(count, name):
    for x in range(count):
        click.echo(f'Hello {name}!')

if __name__ == '__main__':
    hello()

@click.command()是使用Click构建命令行程序的第一步。通过这个装饰器,我们可以轻松将一个Python函数定义为一个命令行命令,并加以丰富与扩展。使用@click.option定义所需的参数,'--count''--name''--count'默认为1,第二个参数中的prompt表示:命令行中没有包含--name选项时,会提示用户输入Your name作为选项值。如果这些代码写在demo.py文件,在命令行输入:

python demo.py --count 3

因为–name没有指定值会有出现Your name:这样的提示,输入:Zhangsan

输出为:

Hello Zhangsan!Hello Zhangsan!Hello Zhangsan!

还有一点需要说明一下:

@click.option("--backbone_names", "-b", type=str, multiple=True, default=[])
@click.option("--layers_to_extract_from", "-le", type=str, multiple=True, default=[])

缩写的情况,在命令窗中输入"–backbone_names"或 “-b"都是一样的,”–layers_to_extract_from"或"-le"也同理。

  • click支持的类型
    -str - 字符串,默认类型
    - int - 整数,使用 type=click.INT - float - 浮点数,使用 type=click.FLOAT
    - bool - 布尔,使用 is_flag=True
    - uuid - UUID,使用 type=click.UUID
    - datetime - 日期时间,使用 type=click.DateTime
    - file - 文件,使用 type=click.File(‘r’) 等
    - path - 路径,使用 type=click.Path()
    - choice - 选项,使用 type=click.Choice([‘a’, ‘b’])
    - tuple - 元组,使用 multiple=True
    - list - 列表,使用 multiple=True
  • click多参数值
    多参数值是指同一个参数可定义多个参数值,其实现方式有两种:
    (1)设置multiple = True
@click.option("--backbone_names", "-b", type=str, multiple=True, default=[])
@click.option("--layers_to_extract_from", "-le", type=str, multiple=True, default=[])

以上代码是在命令窗中一个需要输入主干网络用"–backbone_names"或"-b"指代,一个需要输入提取的层数用"–layers_to_extract_from"或"-le"指代,默认都是空列表。multiple=True说明可以输入多个参数值。如果以上代码写在demo.py文件中,则在命令窗输入:python demo.py -b resnet50 resnet101 -le conv1 conv2,所以backbone_names选项的值为['resnet50', 'resnet101']layers_to_extract_from选项的值为['conv1', 'conv2']

(2)设置nargs

nargs=1时,选项期望接收一个参数值,如果传入0个或多个参数值,会提醒我们参数个数不匹配的错误信息;nargs=N(整数):必须传入N个参数,否则错误;当nargs=-1时,选项可以接收0个、1个或任意多个参数值。不会对参数个数产生限制,所有传入参数值均被收集。

@click.command()
@click.argument("names", nargs=-1)
def say_hello(names):
    if not names:
        click.echo("Hello, Anonymous!")
    else:
        for name in names:
            click.echo(f"Hello, {name}!")


if __name__ == "__main__":
    say_hello()

如果以上代码写在demo.py文件中,命令窗输入:python demo.py zhangsan lisi,则输出为:

Hello, zhangsan!Hello, lisi!

以上是一些比较普通的用法,还有很多很多细节的东西,还有很多东西没有讲,大家可以根据需要查询。