【Python】click模块开发命令行应用

294 阅读4分钟

本人已参与【新人创作礼】活动,一起开启掘金创作之路。

✨博文作者 wangzirui32

💖 喜欢的可以 点赞 收藏 关注哦~~

👉本文首发于CSDN,未经许可禁止转载


😎 hello,大家好,我是wangzirui32,今天我们来学习click模块开发命令行应用,开始学习吧!

1. click

click简介如下(引自官方文档): click 安装命令如下:

pip install click

2. Hello World 第一个示例

确认安装无误后,即可开始学习。创建hello.py,写入代码:

import click

# 命令组
group = click.Group()

# 定义hello命令
@click.command("hello")
def hello():
    click.echo("Hello User ! Welcome !")

# 添加hello命令
group.add_command(hello)

group.main()  # 启用组内命令

我们来逐步解析代码:

  1. import click导入click模块
  2. group = click.Group()定义了命令组group,它用来存储程序中定义的命令。
  3. @click.command("hello")这是一个装饰器,"hello"代表其命令名称。
  4. def hello():定义hello函数。
  5. click.echo("Hello User ! Welcome !")输出问候消息,这里使用了click.echo输出,据官方文档介绍,这个函数比原来的print更强大,支持更多输出功能,推荐使用。
  6. group.add_command(hello)hello命名添加到命令组里。
  7. group.main()启用组内所添加的命令。

我们来看看效果:

PS D:\Python> python hello.py hello
Hello User ! Welcome !

看到我们输入了python hello.py hello表示调用hello.py中的hello命名,之后就输出了问候语。

3. click.option装饰器

还是刚才的例子,只不过代码有些改动:

import click

group = click.Group()

@click.command("hello")
@click.option("--username")  # 加入参数username
def hello(username):   # 函数参数加入username
	# 输出对username的问候语
    click.echo("Hello {}! Welcome!".format(username))

group.add_command(hello)

if __name__ == '__main__':
    group.main()

效果如下:

PS D:\Python> python hello.py hello --username Malfoy 
Hello Malfoy! Welcome!

在上面的例子中,我们加入了参数username,来看看关键的这一行代码@click.option("--username"),它表示为命令添加一个名为username的参数,其在命令行中指定方式为--username。 当然,这个装饰器还有其他的参数,我们接着看下面的例子:

import click

group = click.Group()

@click.command("hello")
@click.option("--username", default="wangzirui32", help="用户名")
@click.option("--email", prompt="你的邮箱: ", help="邮箱")
@click.option('--password', prompt=True,
            hide_input=True, confirmation_prompt=True, help="密码")
def hello(username, email, password):
    click.echo("Hello {}! Welcome! Your email is {}".format(username, email))
    click.echo("Password: {}".format(password))

group.add_command(hello)

if __name__ == '__main__':
    group.main()

效果如下:

PS D:\Python>python hello.py hello --email wangzirui32@***.com  
Password: 
Repeat for confirmation:
Hello wangzirui32! Welcome! Your email is wangzirui32@***.com
Password: 123456

我们来解析其中的3条代码:

  1. @click.option("--username", default="wangzirui32", help="用户名")在这行代码里,我们指定了username的默认参数和它的帮助信息,可以通过--help命令查看。
  2. @click.option("--email", prompt="你的邮箱: ", help="邮箱")在这行代码里,我们指定了prompt参数,表示我们如果在命令行里没有指定email,就在程序运行时输出提示语提示输入。
  3. @click.option('--password', prompt=True,hide_input=True, confirmation_prompt=True, help="密码")这行代码指定了密码参数,prompt=True允许程序运行时输出提示语提示输入,hide_input隐藏输入,confirmation_prompt=True要求校验之前输入的密码,最后指定帮助信息,其实等价于代码click.password_option()。 这里插一句,帮助信息可谓是click中的一大亮点,访问帮助可以使用--help,示例如下:
PS D:\Python> python hello.py hello --help
Usage: hello.py hello [OPTIONS]

Options:
  --username TEXT  用户名
  --email TEXT     邮箱
  --password TEXT  密码
  --help           Show this message and exit.
PS D:\Python> python hello.py --help      
Usage: hello.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  hello

这个装饰器还有其他的参数,这里不多说,笔者已将它整理成如下表格:

参数名称参数介绍
default指定默认值
help指定帮助信息
type指定参数的数据类型(如str,float)
required是否为必填选项,True为必填
prompt在命令行提示用户输入对应选项的信息
nargs指定此命令接收参数的数量,超过会报错

4. click.Choice 选择参数

先来看看例子,Code:

import click

group = click.Group()

@click.command("hello")
@click.option("--fruit", type=click.Choice(['apple', 'orange', 'grapes']))   # 定义为选择参数
def hello(fruit):
    click.echo("水果:{}".format(fruit))

group.add_command(hello)

if __name__ == '__main__':
    group.main()

运行效果:

PS D:\Python> python hello.py hello --fruit apple     
水果:apple

这里使用了click.Choice传入选项列表,再将其以参数type传入click.option,就完成了,如果输入了不在选项列表里的值,程序会报错。

5. click.secho 输出

上面我们介绍了click.echo的输出方式,但在click里还有另一种输出函数click.secho,来看代码:

import click

group = click.Group()

@click.command("hello")
def hello():
    click.secho("Hello!", fg="green")
    click.secho("你好!", fg="red")

group.add_command(hello)

if __name__ == '__main__':
    group.main()

输出:

输出

click.secho可以输出带有颜色的文字,其实这段代码等价于:

click.echo(click.style("Hello!", fg="green"))
click.echo(click.style("你好!", fg="red"))

其效果是一样的。


🎉🎉🎉 好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!