命令行模块——click(一)
今天要重点介绍我们的新朋友click!!!!!关于这块知识做一个详细的梳理,以备今后使用。开始喽!
1.导入
click模块是Python的一个第三方库,用于创建命令行界面(CLI)的第三方库。它旨在让开发者能够轻松编写可读性强、易于理解和易于维护的命令行应用程序。使用前需要安装click包,安装命令:pip install click
或conda 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!
以上是一些比较普通的用法,还有很多很多细节的东西,还有很多东西没有讲,大家可以根据需要查询。