Python_7:命令行库Click

目录:

一、简介

二、快速上手

使用 click 构造漂亮的Python命令行程序

大家都说好用的python命令行库:click

三、中文文档

中文文档-选项

 

一、简介:

Click 是一个利用很少的代码以可组合的方式创造优雅命令行工具接口的 Python 库。

Click 被设计用来快速构建命令行程序,因此缺乏一些扩展性,比如他不允许高度定制help介绍。Click 是用来支持 Flask 开发框架的。

 

二、快速上手:

1、基本使用

# hello.py
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 x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()

然后可以这样运行该脚本 python hello.py --count=3,并且 Click 还会自动生成 help 信息。

2、Option 参数

Click 使用基本可以归纳为

  • 使用 @click.command() 装饰一个函数,使之成为命令行接口;
  • 使用 @click.option() 等装饰函数,为其添加命令行选项等。

最基础的用法, option 接受一个变量

@click.command()
@click.option('--n', default=1)
def hello(n):
    click.echo('hello' * n)

使用 --n=2 输出两遍

接受多个变量,需要使用 nargs 指定数量

@click.command()
@click.option('--pos', nargs=2, type=float)
def cal(pos):
    click.echo('%s / %s' % pos)

使用 --pos 5.0 4.0

如果参数是固定的几个值,可以使用可选项

@click.command()
@click.option('--hash-type', type=click.Choice(['md5', 'sha1']))
def digest(hash_type):
    click.echo(hash_type)

使用 --hash-type=md5 参数只能为 md5 或者 sha1,否则报错。

option 还有其他一些参数,比如 prompt 当用户忘记该参数时,将错误报出来,hide_input 可以隐藏输入,常用于密码输入,confirmation_prompt 验证输入等等。

Click 封装了

@click.password_option()
@click.confirmation_option(prompt='Are you sure you want to drop the db?')

3、argument 参数

和 Option 一样,Argument 最基础的应用就是传递一个简单变量值

@click.command()
@click.argument('input', type=click.File('rb'))
@click.argument('output', type=click.File('wb'))
def inout(input, output):
    while True:
        chunk = input.read(1024)
        if not chunk:
            break
        output.write(chunk)


三、Click 中文文档

 

通过 option() 装饰器可以给命令增加选项。通过配置参数来控制不同的选项。Click 中的选项不同于 位置参数

1、基本的值选项

最基本的选项是值选项。这种类型的选项接受一个是值得参数。如果没有指定值的类型,那么将使用默认类型 STRING。默认情况下,参数的名称为第一个 长选项,如果没有长选项则为第一个短选项。

@click.command()
@click.option('--n', default=1)
def dots(n):
    click.echo('.' * n)

在命令行中运行:

$ dots --n=2
..

这上述例子中选项值的类型是 INT,因为值的默认值为数字。

2、多个值的选项

有时候,你需要有多个值得选项。这种选项只支持固定数量的参数。通过 nargs 参数来配置。多个值将被放入一个元组(tuple)中。

@click.command()
@click.option('--pos', nargs=2, type=float)
def findme(pos):
    click.echo('%s / %s' % pos)

在命令行中运行:

$ findme --pos 2.0 3.0
2.0 / 3.0

3、使用元组(tuple)代替多个值的选项

4.0 新版功能.

正如你所看到的,使用 nargs 来设置一个每个值都是数字的选项,得到的元组(tuple)中都是一样的数字类型。这可能不是你想要的。 通常情况下,你希望元组中包含不同类型的值。你可以直接使用下列的特殊元组达成目的:

@click.command()
@click.option('--item', type=(unicode, int))
def putitem(item):
    click.echo('name=%s id=%d' % item)

在命令行中运行:

$ putitem --item peter 1338
name=peter id=1338

使用元组的选项,nargs 会根据元组的长度自动生成,同时自动使用 click.Tuple。以下列子可等价表达上述例子:

@click.command()
@click.option('--item', nargs=2, type=click.Tuple([unicode, int]))
def putitem(item):
    click.echo('name=%s id=%d' % item)

4、多个选项

和 nargs 类似,有时候可能会需要一个参数传递多次,同时记录每次的值而不是只记录最后一个值。 比如,git commit -m foo -m bar 会记录两行 commit 信息:foo 和 bar。这个功能 可以通过 multiple 参数实现:

例如:

@click.command()
@click.option('--message', '-m', multiple=True)
def commit(message):
    click.echo('\n'.join(message))

在命令行中运行:

$ commit -m foo -m bar
foo
bar

5、计数

在一些非常罕见的情况下,使用重复的选项来计数是很有意思的。例如:

@click.command()
@click.option('-v', '--verbose', count=True)
def log(verbose):
    click.echo('Verbosity: %s' % verbose)

在命令行中运行:

$ log -vvv
Verbosity: 3

6、布尔值标记

布尔值标记用于开启或关闭选项。可以通过以 / 分割的两个标记来实现开启或关闭选项。(如果 / 在一个选项名中,Click 会自动识别其为布尔值标记,隐式默认 is_flag=True)。Click 希望你能提供一个开启和关闭标记然后设置默认值。

例如:

import sys

@click.command()
@click.option('--shout/--no-shout', default=False)
def info(shout):
    rv = sys.platform
    if shout:
        rv = rv.upper() + '!!!!111'
    click.echo(rv)

在命令行中运行:

$ info --shout
LINUX2!!!!111
$ info --no-shout
linux2

如果你实在不想要一个关闭标记,你只需要定义开启标记,然后手动设置它为标记。

import sys

@click.command()
@click.option('--shout', is_flag=True)
def info(shout):
    rv = sys.platform
    if shout:
        rv = rv.upper() + '!!!!111'
    click.echo(rv)

在命令行中运行:

$ info --shout
LINUX2!!!!111
 
posted @ 2021-04-08 15:42  一路向北321  阅读(639)  评论(0编辑  收藏  举报