|
|
|
|
移动端

3.5.1 使用click解析命令行参数

《Python Linux系统管理与自动化运维》第3章打造命令行工具,本章介绍了如何使用Python语言解析ini格式的配置文件以及如何使用Python语言解析命令行参数,紧接着,本章介绍了Python标准库中的logging库,在本章最后,我们介绍了如何使用开源项目打造功能更加强大的命令行工具。本节为大家介绍使用click解析命令行参数。

作者:赖明星来源:机械工业出版社|2017-09-28 17:19

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


3.5 与命令行相关的开源项目

在这一小节中,我们将会介绍两个与命令行工具相关的开源项目。使用这两个开源项目,只需要很少的代码就能够实现强大的功能。

3.5.1 使用click解析命令行参数

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

click是一个第三方库,因此,在使用之前需要先安装:

  1. pip install click 

Click对argparse的主要改进在易用性,使用Click分为两个步骤:

1)使用 @click.command() 装饰一个函数,使之成为命令行接口;

2)使用 @click.option() 等装饰函数,为其添加命令行选项等。

我们以Click官方文档中的例子来演示click的使用。如下所示:

  1. import click  
  2.  
  3. @click.command()  
  4. @click.option('--count', default=1help='Number of greetings.')  
  5. @click.option('--name', prompt='Your name',  
  6.               help='The person to greet.')  
  7. def hello(count, name):  
  8.     """Simple program that greets NAME for a total of COUNT times."""  
  9.     for x in range(count):  
  10.         click.echo('Hello %s!' % name)  
  11.  
  12. if __name__ == '__main__':  
  13.     hello() 

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

command:使函数hello成为命令行接口;

option:增加命令行选项;

echo:输出结果,使用echo进行输出是为了获得更好的兼容性,因为Python 2中print是一个语句,Python 3中print是一个函数。

运行上面这段程序,可以通过命令行指定count和name的取值。由于我们在option函数中使用了prompt选项,因此,当我们没有直接指定name这个参数时,Click会提示我们在交互模式下输入。如下所示:

  1. $ python hello.py --count=3 
  2. Your name: John  
  3. Hello John!  
  4. Hello John!  
  5. Hello John! 

与argparse一样,Click也会自动为我们产生帮助信息。如下所示:

  1. $ python hello.py --help  
  2. Usage: hello.py [OPTIONS]  
  3.  
  4.     Simple program that greets NAME for a total of COUNT times.  
  5.  
  6. Options:  
  7.     --count INTEGER  Number of greetings.  
  8.     --name TEXT      The person to greet.  
  9.     --help           Show this message and exit. 

option最基本的用法就是通过指定命令行选项的名称,从命令行读取参数值,再将其传递给函数。在上面的例子中,除了设置命令行选项的名称,我们还指定了默认值和帮助信息。option常用的设置参数如下:

default:设置命令行参数的默认值;

help:参数说明;

type:参数类型,可以是 string、int、float等;

prompt:当在命令行中没有输入相应的参数时,会根据prompt提示用户输入;

nargs:指定命令行参数接受的值的个数。

接下来我们看几个官方给出的Click使用案例,读者可以思考一下这些案例是如何使用Python标准库实现的。

在标准库的argparse中,可以通过nargs配置参数的个数,通过type设置参数的数据类型。在Click中,也可以非常方便地实现相同的功能。如下所示:

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

在这个例子中,我们的程序接受两个参数。Click会自动将参数转换成浮点数,并且,将两个参数以元组的形式传递一个pos变量。

如果某个命令行参数只能取固定的几个值之一,那么,就可以使用Click中的Choice函数。Choice的参数是一个列表,该列表中列出所有可能的值。如下所示:

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

如果我们的应用程序需要从命令行参数中输入密码,使用标准库的argparse只能像输入普通参数一样输入密码。这种方式输入密码存在一定的安全隐患,例如,输入密码的命令存在于命令的历史列表中,其他用户可以通过命令的历史列表,得到我们的密码。

在Click中,这个问题非常容易解决,而且解决地非常优美。我们只需要设置prompt为True,就能够交互式地输入密码,设置hide_input为True,就可以隐藏我们的命令行输入,设置confirmation_prompt为True,就可以进行密码的两次验证。如下所示:

  1. @click.command()  
  2. @click.option('--password', prompt=Truehide_input=True,  
  3.               confirmation_prompt=True)  
  4. def encrypt(password):  
  5.     click.echo('Encrypting password to %s' % password.encode('rot13'))  
  6.  
  7. $ encrypt  
  8. Password:   
  9. Repeat for confirmation:   
  10. Encrypting password to frperg 

如果读者是一位Linux资深用户,一定知道Bash里面有一个非常有用的功能——使用fc命令编辑比较长的输入。例如,我们在命令行输入了一串非常长的命令,执行的时候提示我们输入参数有误。这个时候,如果我们按“上”键得到刚才执行的命令,然后跳转到出错的位置进行编辑,效率是非常低的。更好的做法是,输入fc命令,在vi编辑器中编辑刚才执行的命令。输入fc命令并回车以后会打开一个编辑器,编辑器已经保存了上一条命令的内容。我们只需要在编辑器中修复错误输入,然后退出编辑器。退出编辑器以后,刚才编辑的命令将会自动运行,非常方便。

使用Click,我们也可以在Python程序中实现类似的功能。如下所示:

  1. from __future__ import print_function  
  2. import click  
  3. message = click.edit()  
  4. print(message, end=""

当我们执行这段程序,系统会自动进入默认编辑器。进入编辑器以后,我们就可以在编辑器中编辑输入的数据。

Click是一个优秀的开源项目,有着非常详细的官方文档,读者可以通过官方文档了解Click的更多用法。Click官方文档的地址是 http://click.pocoo.org/5/

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Oracle 10g应用指导与案例精讲

本书作者结合自己多年实践经验,从Oracle开发应用中遇到的问题着手,全面系统地介绍Oracle的安装与卸载、数据字典、安全管理以及用PL/SQL开...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊