Python自研工具,在调度或测试中,重要的两种模式:脚本模式、命令行模式。尤其接触pycharm、eclipse这类强大的IDE,或者配合vs code这种综合的文本编辑器。但提供给使用者,命令行模式就显得非常重要了,目前有很多热门的命令行工具,觉得最好用的就是本文的主角:Click.
命令行模式在Python开发中并不陌生,简单的说就是python hello_world.py这种使用命令的模式运行Python程序。
常用的命令行工具主要有以下几项:
内置的sys
argparse
tensorflow的Flags
getopt
当然还有很多,命令行工具中用起来最爽的就是 Click,只要很少的代码就可以优雅地创造一个命令行工具,它致力于将创建命令行工具的过程变的快速而有趣。
前言
click是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib。
Click主要有以下3个亮点:
- 命令的任意嵌套
- 自动帮助页面生成
- 支持在运行时延迟加载子命令
安装
$ pip install click
Click支持Python 3.4和更新版本、Python 2.7和PyPy。
快速使用
Click 的使用大致有两个步骤:
1.使用 @click.command() 装饰一个函数,使之成为命令行接口;
2.使用 @click.option() 等装饰函数,为其添加命令行选项等。
快速创建一个简单的demo
创建 click_demo.py ,写一个最简单的函数
import click
@click.command()
def hello():
click.echo('Hello World!')
if __name__ == '__main__':
hello()
运行:
python click_demo.py
Hello World!
注:装饰器 click.command() 使函数秒变命令行工具,echo 函数的作用等同于 print 函数。
参数
option常用的设置参数如下:
default: 设置命令行参数的默认值
help: 给命令行选项添加帮助信息
type: 参数类型,例 string, int, float 等
prompt: 当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入
required:是否为必填选项,True为必填,False为非必填
nargs: 指定命令行参数接收的值的个数
指定Type,默认值default,多选项multiple
不同于多值选项是通过一个选项指定多个值,多选项则是使用多个相同选项分别指定值,通过 click.option 中的 multiple=True 来实现
import click
@click.command()
@click.option("--count",“-c”, default=1, help="打印次数", type=int) # 指定 count 是 int 类型
@click.option('--message', '-m', multiple=True)
def hello(count):
"""
一个简单示例
"""
for i in range(count,message):
click.echo('Hello World!')
click.echo('\n'.join(message))
if __name__ == '__main__':
hello()
–count:count是参数的名字
default :参数的默认值
type:给参数指定类型
help:说明文档
执行脚本的时候后面加上参数 --help 就可以查看说明文档。
$ python click_demo.py --help
Usage: click_demo.py [OPTIONS]
这是一个简单示例
Options:
-c, --count INTEGER 打印次数
--help Show this message and exit.
指定参数运行:
>python click_demo.py --count 3
Hello World!
Hello World!
Hello World!
>python click_demo.py #存在默认值,直接运行
Hello World!
>python click_demo.py -m foo -m bar --message baz
提示选项prompt
有些命令行工具在运行的时候要求用户输入信息,比如需输入用户、密码等,可以给 option 装饰器指定 prompt 参数,其中在输入密码的时候,我们希望能隐藏显示。option 提供了两个参数来设置密码的输入:用于隐藏输入【hide_input】和用于重复输入【confirmation_promt】。
import click
@click.command()
@click.option("--count","-c", default=1, help="打印次数", type=int)
@click.option("--name","n", prompt="请输入用户名", help="用户名")
@click.option("--pass","p", prompt=True, hide_input=True, confirmation_prompt=True)
@click.password_option() #此种是简写,可替换上面写法
def hello(count, name, pass):
"""
一个简单示例
"""
for i in range(count):
click.echo(f'Hello {name}!')
click.echo('password: %s' % password)
if __name__ == '__main__':
hello()
运行:
$ python click_demo.py
请输入用户名: lzjun
Hello lzjun!
Password: # 不会显示密码
Repeat for confirmation: # 重复一遍
password: 666666
可选值click.Choice,required
在某些情况下,一个参数的值只能是某些可选的值,如果用户输入了其他值,我们应该提示用户输入正确的值。在这种情况下,我们可以通过 click.Choice() 来限定:
import click
@click.command()
@click.option('-c',required=True,type=click.Choice(['start','stop']))
#限定-c的值为start,或者stop,required表示是否为必填参数
def click_choice(c):
click.echo('command is %s' % c )
if __name__ == '__main__':
click_choice()
运行:
$ python click_choice.py
Usage: click_choice.py [OPTIONS]
Try "click_choice.py --help" for help.
Error: Missing option "-c". Choose from:
start,
stop.
$ python click_choice.py -c stop
command is stop
多值参数nargs
如一个参数需要接收多个值。option 支持设置固定长度的参数值,通过 nargs指定。
import click
@click.command()
@click.option('--center', nargs=2, type=float, help='center of the circle')
@click.option('--radius', type=float, help='radius of the circle')
def circle(center, radius):
click.echo('center: %s, radius: %s' % (center, radius))
if __name__ == '__main__':
circle()
运行:
$ python click_multi_values.py --center 3 4 --radius 10
center: (3.0, 4.0), radius: 10.0
$ python click_multi_values.py --center 3 4 5 --radius 10
Usage: click_multi_values.py [OPTIONS]
Error: Got unexpected extra argument (5)
以上了解后也就初步掌握了 click 的简单用法,并了解到它与 argparse和 docopt 的不同。