github:https://github.com/pallets/click
Click 是 Flask 的开发团队 Pallets 的另一款开源项目,它是用于快速创建命令行的第三方模块。
我们知道,Python 内置了一个 Argparse 的标准库用于创建命令行,但使用起来有些繁琐,Click 相比于 Argparse,就好比 requests 相比于 urllib。
安装
pip install -U click
例子1
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):
"""Simple program that greets NAME for a total of COUNT times."""
for _ in range(count):
click.echo(f"Hello, {name}!")
if __name__ == '__main__':
hello()
结果
$ python hello.py --count=3
Your name: Click
Hello, Click!
Hello, Click!
Hello, Click!
方法功能
- command:用于装饰一个函数,使得该函数作为命令行的接口,例如上述装饰hello
- option:用于装饰一个函数,主要功能是为命令行添加选项
- echo:用于输出结果,由于print函数在2.x和3.x之间存在不同之处,为了更好的兼容性,因此提供了echo输出方法
- Choice:输入为一个列表,列表中为选项可选择的值
把上述程序的帮助信息输出
$ python hello.py --help
Usage: hello.py [OPTIONS]
Simple program that greets NAME for a total of COUNT times.
Options:
--count INTEGER Number of greetings.
--name TEXT The person to greet.
--help Show this message and exit.
其他属性描述
- default:给命令行选项添加默认值
- help:给命令行选项添加帮助信息
- type:指定参数的数据类型,例如int、str、float
- required:是否为必填选项,True为必填,False为非必填
- prompt:当在命令行中没有输入相应的参数时,会根据 prompt 提示用户输入
- nargs:指定命令行选项接收参数的个数,如果超过则会报错
- metavar:如何在帮助页面表示值
group方法
Click还提供了group方法,该方法可以添加多个子命令,
import click
@click.group()
def first():
print("hello world")
@click.command()
@click.option("--name", help="the name")
def second(name):
print("this is second: {}".format(name))
@click.command()
def third():
print("this is third")
first.add_command(second)
first.add_command(third)
first()
调用子命令second
$ python test.py second --name hh
# 输出
hello world
this is second: hh
密码输入
# 密码输入有两种方法
import click
@click.group()
def db():
pass
# 方法1 :hide_input 隐式输入,confirmation_prompt:再次确认
@click.command()
@click.option('-p', prompt='请输入密码', hide_input=True, confirmation_prompt=True)
def inputp(p):
"""输入密码"""
click.echo('p is %s' % p)
# 方法2: 我试了下,传参只能是password,其他的会报错
@click.command()
@click.password_option()
def inputp2(password):
click.echo('p is %s' % password)
db.add_command(inputp)
db.add_command(inputp2)
if __name__ == '__main__':
db()
# 运行如下
$ python hello.py --help
$ python3 hello.py inputp
$ python3 hello.py inputp2
参考:https://zhuanlan.zhihu.com/p/68337606
https://blog.csdn.net/weixin_38278993/article/details/100052961
https://www.jianshu.com/p/f6488f10febb