pythonClick库知识点汇总
Python Click库
作⽤:⽤于快速创建命令⾏,或者说,通过装饰器@clickmand(把⼀个函数⽅法装饰成命令⾏接⼝。
安装:
$ pip install click
如何使⽤:
基础⽅法:装饰器函数
使⽤@clickmand() 装饰⼀个函数,使之成为命令⾏接⼝
使⽤@click.option() 装饰函数,为其添加命令⾏选项
使⽤@click.argument()装饰函数,为其添加命令⾏选项
import click
@clickmand()
@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."""
# 会当作help信息进⾏输出
for x in range(count):
if __name__ =='__main__':
hello()
将上⾯的代码保存为hello.py,在终端中运⾏:
python3 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.
argument与option
argument() 装饰器⽐ option() 功能简单些,后者⽀持下⾯的特性:
⾃动提⽰缺失的输⼊;
option 参数可以从环境变量中获取,argument 参数则不⾏;
option 参数在 help 输出中有完整的⽂档,argument 则没有;
⽽ argument 参数可以接受可变个数的参数值,⽽ option 参数只能接收固定个数的参数值(默认是 1 个)。
命令⾏的参数名由 “-short_name” 或 “–long_name” 声明,如果参数名既没有以 “-“ 开头,也没有以 “–” 开头关于命令⾏参数,以前缀“-”开头,和以前缀“–”(两个连续短横线)开头,或者不带任何前缀开头的区别,参考原⽂:
Parameter Names
Parameters (both options and arguments) accept a number of positional arguments which are passed to the command function as parameters. Each string  with a single dash is added as a short argument; each string starting with a double dash as a long one.
If a string is added without any dashes, it becomes the internal parameter name which is also used as variable name.
If all names for a parameter contain dashes, the internal name is generated automatically by taking the longest argument and converting all dashes to und erscores.
The internal name is converted to lowercase.
Examples:
For an option with ('-f', '--foo-bar'), the parameter name is foo_bar.
For an option with ('-x',), the parameter is x.
For an option with ('-f', '--filename', 'dest'), the parameter name is dest.
For an option with ('--CamelCaseOption',), the parameter is camelcaseoption.
For an arguments with (`foogle`), the parameter name is foogle. To provide a different human readable name for use in help text, see the section about Truncating Help Texts.
Option
option 最基础的⽤法就是简单值变量,option 接收⼀个变量值,下⾯是⼀段⽰例代码:
大学python知识点汇总@clickmand()
@click.option('--n', default=1)
def dots(n):
如果在命令⾏后⾯跟随参数 --n=2 就会输出两个点,如果传参数,默认输出⼀个点。上⾯的代码中,参数类型没有显⽰给出,但解释器会认为是 INT 型,因为默认值 1 是 int 值。
有些时候需要传⼊多个值,可以理解为⼀个 list,option 只⽀持固定长度的参数值,即设置后必须传⼊,个数由 nargs 确定。
@clickmand()
@click.option('--pos', nargs=2,type=float)
def findme(pos):
# findme --pos 2.0 3.0 输出结果就是 2.0 / 3.0
既然可以传⼊ list,那么 tuple 呢?Click 也是⽀持的:
@clickmand()
@click.option('--item',type=(unicode,int))
def putitem(item):
"""
这样就传⼊了⼀个 tuple 变量
putitem --item peter 1338 得到的输出就是
name=peter id=1338
"""
上⾯没有设置 nargs,因为 nargs 会⾃动取 tuple 的长度值。因此上⾯的代码实际上等同于:
@clickmand()
@click.option('--item', nargs=2,type=click.Tuple([unicode,int]))
def putitem(item):
option 还⽀持同⼀个参数多次使⽤,类似 git commit -m aa -m bb 中 -m 参数就传⼊了 2 次。option 通过 multiple 标识位来⽀持这⼀特性:
@clickmand()
@click.option('--message','-m', multiple=True)
def commit(message):
有时候,命令⾏参数是固定的⼏个值,这时就可以⽤到 Click.choice 类型来限定传参的潜在值:
# choice
@clickmand()
@click.option('--hash-type',type=click.Choice(['md5','sha1']))
def digest(hash_type):
当上⾯的命令⾏程序参数 --hash-type 不是 md5 或 sha1,就会输出错误提⽰,并且在 --help 提⽰中也会对 choice 选项有显⽰。
如果希望命令⾏程序能在我们错误输⼊或漏掉输⼊的情况下,友好的提⽰⽤户,就需要⽤到 Click 的 prompt 功能,看代码:
# prompt
@clickmand()
@click.option('--name', prompt=True)
def hello(name):
如果在执⾏ hello 时没有提供 –name 参数,控制台会提⽰⽤户输⼊该参数。也可以⾃定义控制台的提⽰输出,把 prompt 改为⾃定义内容即可。
对于类似账户密码等参数的输⼊,就要进⾏隐藏显⽰。option 的 hide_input 和 confirmation_promt 标识就是⽤来控制密码参数的输⼊:
# password
@clickmand()
@click.option('--password', prompt=True, hide_input=True,
confirmation_prompt=True)
def encrypt(password):
Click 把上⾯的操作进⼀步封装成装饰器 click.password_option(),因此上⾯的代码也可以简化成:
# password
@clickmand()
@click.password_option()
def encrypt(password):
有的参数会改变命令⾏程序的执⾏,⽐如 node 是进⼊ Node 控制台,⽽ node --verion 是输出 node 的版本号。Click 提供 eager 标识对参数名进⾏标记,拦截既定的命令⾏执⾏流程,⽽是调⽤⼀个回调⽅法,执⾏后直接退出。下⾯模拟 click.version_option() 的功能,实现 --version 参数名输出版本号:
# eager
def print_version(ctx, param, value):
if not value silient_parsing:
return
@clickmand()
@click.option('--version', is_flag=True, callback=print_version,
expose_value=False, is_eager=True)
def hello():
对于类似删除数据库表这样的危险操作,Click ⽀持弹出确认提⽰,–yes 标识位置为 True 时会让⽤户再次确认:
# yes parameters
def abort_if_false(ctx, param, value):
if not value:
ctx.abort()
@clickmand()
@click.option('--yes', is_flag=True, callback=abort_if_false,
expose_value=False,
prompt='Are you sure you want to drop the db?')
def dropdb():
测试运⾏下:
$ dropdb
Are you sure you want to drop the db? [y/N]: n
Aborted!
$ dropdb --yes
Dropped all tables!
同样的,Click 对次进⾏了封装,firmation_option() 装饰器实现了上述功能:
@clickmand()
@firmation_option(prompt='Are you sure you want to drop the db?')
def dropdb():
# range
@clickmand()
@click.option('--count',type=click.IntRange(0,20, clamp=True))
@click.option('--digit',type=click.IntRange(0,10))
def repeat(count, digit):
if __name__ =='__main__':
repeat()
关于is_flag
Option的关键字参数中,有is_flag 参数,默认值是None,如果设置了该参数,即is_flag=True,则表⽰Option函数定义的参数为“标记”参数。
原⽂:
is_flag – forces this option to act as a flag. The default is auto detection.
例⼦:
import click
@app.climand()# 注册为命令
@click.option('--drop', is_flag=True,help='Create after drop.')# 设置选项
def initdb(drop):
"""Initialize the database."""
if drop:# 判断是否输⼊了选项
db.drop_all()
运⾏结果:
默认情况下,函数名称就是命令的名字,现在执⾏ flask initdb 命令就可以创建数据库表:
$ flask initdb
使⽤ --drop 选项可以删除表后重新创建:
$ flask initdb --drop
is_flag原⽂⽂档请参考:
Argument
Argument 的作⽤类似 Option,但没有 Option 那么全⾯的功能。
和 Option ⼀样,Argument 最基础的应⽤就是传递⼀个简单变量值:
@clickmand()
@click.argument('filename')
def touch(filename):
命令⾏后跟的参数值被赋值给参数名 filename。
另⼀个⽤的⽐较⼴泛的是可变参数,也是由 nargs 来确定参数个数,变量值会以 tuple 的形式传⼊函数:
@clickmand()
@click.argument('src', nargs=-1)
@click.argument('dst', nargs=1)
def copy(src, dst):
for fn in src:
运⾏程序:
$ my_folder
to folder my_folder
to folder my_folder
Click ⽀持通过⽂件名参数对⽂件进⾏操作,click.File() 装饰器就是处理这种操作的,尤其是在类 Unix 系统下,它⽀持以 - 符号作为标准输⼊/输出。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。