一、click模块
click是Flask作者(Armin Ronacher)开发的一个第三方模块,用于快速创建命令行。
click相对于标准库argparse,就好比requests相对于标准库urllib,使用简单。

二、安装

pip install click

三、使用示例
Click 的使用大致有两个步骤:

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

官方例子:

import click


@click.command()
@click.option('--count', default=1, help='Number of greetings.', prompt='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):
        click.echo('Hello %s!' % name)


if __name__ == '__main__':
    hello()

在上面的例子中,函数hello接受两个参数,分别是count和name,他们的取值从命令行中获取,这里我们使用了click模块中的command、option、echo,他们的作用如下:

command:使函数hello成为命令行接口
option:增加命令行选项
echo:输出结果,使用echo进行输出是为了更好的兼容性,因为python 2中的print是个语句,python 3中的print 是一个函数
运行上面的脚本,可以通过命令指定–name,–count的值,由于我们在option中指定了prompt选项,那么如果我们执行脚本没有传递name这个参数时,Click会提示我们在交互模式下输入。

四、其他参数

option最基本的用法就是通过指定命令行选项的名称,从命令行读取参数值,再将其传递给函数。option常用的参数含义:

default: 设置命令行参数的默认值
help:参数说明
type:参数类型,可以是string、int、float等
prompt:当在命令行中没有输入相应的参数时,会更具prompt提示用户输入
nargs:指定命令行参数接受的值的个数
required:是否为必填参数

import click
 
@click.command()
@click.option('--pos',nargs=2,type=float)
 
def getfloat(pos):
    click.echo('%s / %s' % pos )
 
if __name__ == '__main__':
    getfloat()

五、扩展用法
1、限定用户从选项列表中选择输入

import click


@click.command()
@click.option('-c', required=True, type=click.Choice(['start', 'stop']), prompt='cmd')  # 限定-c的值为start,或者stop,required表示是否为必填参数
def getcommand(c):
    click.echo('command is %s' % c)


if __name__ == '__main__':
    getcommand()

2、自动进入默认编辑,Linux vi,windows 记事本或默认程序

import click


message = click.edit()
print(message, end='')

六、打包跨平台可执行程序
通过click编写了命令行方法后,还需把.py文件转换为控制台可执行的命令行程序。最简单的方法,就是在文件末尾加上以下代码:

if __name__ == '__main__':
	command()

Click 支持使用 setuptools 来更好的实现命令行程序打包,把源码文件打包成系统中的可执行程序,并且不限平台。一般我们会在源码根目录下创建 setup.py 脚本,先看一段简单的打包代码:
脚本方法文件:
click_move.py

import click

@click.command()
@click.argument('src', nargs=-1)
@click.argument('dst', nargs=1)
def copy(src, dst):
    for fn in src:
        print("move %s to foder %s"%(fn, dst))

setup.py

from setuptools import setup
setup(
    name='click_move',
    version='0.1',
    py_modules=['click_move'],
    install_requires=[
        'Click',
    ],
    entry_points='''
        [console_scripts]
        click_move=click_move:copy
    ''',
)

留意 entry_points 字段,在 console_scripts 下,每一行都是一个控制台脚本,等号左边的的是脚本的名称,右边的是 Click 命令的导入路径。

跟安装python模块一样,python setup.py install后,就可以使用编写好的命令行脚本了。

>click_move 1.txt 2.txt dir
move 1.txt to foder dir
move 2.txt to foder dir