|
|
|
|
移动端

3.5.2 使用prompt_toolkit打造交互式命令行工具

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

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

3.5.2 使用prompt_toolkit打造交互式命令行工具

prompt_toolkit是一个处理交互式场景的开源库,用来取代开源的readline与curses。prompt_toolkit提供了很多高级功能,可以有效提升交互编程的易用性。prompt_toolkit的特性包括:

1)语法高亮;

2)支持多行编辑;

3)支持代码补全;

4)支持自动提示;

5)可以使用鼠标移动光标;

6)支持Emacs与Vi风格的快捷键;

7)支持查询历史;

8)对Unicode支持友好;

9)使用Python语言开发,跨平台。

prompt_toolkit是一个开源的库,因此,在使用之前需要先安装:

  1. pip install prompt_toolkit 

下面是一个Python语言开发的REPL(读取–求值–输出)应用。在这个应用中,我们输入数据,Python程序打印我们的输入。这个程序非常简单,但同时也存在诸多问题:

  1. while True:  
  2.     user_input = raw_input('>')  
  3.     print(user_input) 

在这段程序中,我们无法使用任何Linux下的快捷键。甚至在输入错误时,按退格删除内容都会出现问题。尽管这个初级的交互式程序非常难用,但是,它依然是很多Python工程师开发交互式程序的输入方式。其实,我们只需要很少的改动,就能够显著提升这个交互式程序的易用性。在下面这段程序中,我们使用prompt_toolkit中的prompt函数来接受用户输入。如下所示:

  1. from prompt_toolkit import prompt  
  2.  
  3. while True:  
  4.     user_input = prompt('>')  
  5.     print(user_input) 

这段程序和前面的程序一样简单,但是,从易用性来说有了质的飞跃。在这段程序中,我们可以使用Bash下常用的快捷键。例如,使用ctrl+a跳到输入的开头,使用ctrl+e跳转到输入的模块,使用ctrl+k删除光标到末尾的内容。

上面这段程序虽然可以使用Bash下的常用快捷键,但是,无法查看历史输入。例如,我们在Bash下,可以使用方向键中的“上”和“下”查看历史输入,使用ctrl+r查看历史输入。使用prompt_toolkit,我们也可以轻易地实现查找历史的功能。为了实现查找历史的功能,我们需要用到prompt_toolkit.history模块下的FileHistory类,随后,在调用prompt时构造一个FileHistory对象,并传递给history参数。如下所示:

  1. from __future__ import unicode_literals  
  2. from prompt_toolkit import prompt  
  3. from prompt_toolkit.history import FileHistory  
  4.  
  5. while True:  
  6.     user_input = prompt('>',  
  7.                         history=FileHistory('history.txt'),  
  8.                        )  
  9.     print(user_input) 

在这个例子中,我们只增加了两行代码就实现了查看历史输入的功能。

如果说前面两个功能只是将Python交互式输入打造成一个合格的命令行工具的话,那么,接下来要介绍的两个特性将带给用户惊喜。

上述例子已经实现了查看历史输入的功能,事实上我们还可以充分利用历史输入的数据,在用户输入时进行自动提示。这个功能看起来很高端,但是,在prompt_tooklit中实现却出乎意料的简单,只需要在调用prompt函数时指定auto_suggest的参数即可。如下所示:

  1. from __future__ import unicode_literals  
  2. from prompt_toolkit import prompt  
  3. from prompt_toolkit.history import FileHistory  
  4. from prompt_toolkit.auto_suggest import AutoSuggestFromHistory  
  5.  
  6. while True:  
  7.     user_input = prompt('>',  
  8.                         history=FileHistory('history.txt'),  
  9.                         auto_suggest=AutoSuggestFromHistory(),  
  10.                        )  
  11.     print(user_input) 

图3-1给出了一个自动提示的例子。在这个例子中,我们先输入了两个字符串,随后,当我们的输入匹配历史输入时,prompt_toolkit将以暗色字体显示匹配的历史输入,这个时候,我们只需要按下回车就能自动输入之前的一长串字符串。

接下来我们看另外一个高级功能。在这个例子中,我们要实现自动补全的功能,即用户输入了关键字的一部分内容,我们的交互式程序能够根据已有的输入进行提示,用户可以使用tab键补全选择提示的内容。我们只需使用prompt-toolkit中一个名为WordCompleter的函数即可实现。prompt-toolkit将用户输入与可能建议的字典进行匹配,并提供一个列表,用户可以使用tab键从列表中选择输入。如下所示:

  1. from __future__ import unicode_literals  
  2. from prompt_toolkit import prompt  
  3. from prompt_toolkit.history import FileHistory  
  4. from prompt_toolkit.auto_suggest import AutoSuggestFromHistory  
  5. from prompt_toolkit.contrib.completers import WordCompleter  
  6.  
  7. SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete',   
  8.                              'drop'], ignore_case=True)  
  9.  
  10. while True:  
  11.     user_input = prompt('SQL>',   
  12.                         history=FileHistory('history.txt'),  
  13.                         auto_suggest=AutoSuggestFromHistory(),  
  14.                         completer=SQLCompleter,  
  15.                         )  
  16.     print(user_input) 

图3-2给出了自动补全的例子,易用性几乎与IPython中的tab键自动补全一模一样。

我们现在有了一个REPL,可以实现使用快捷键、查找历史、自动完成以及自动提示等功能。我只用了少量代码就得到了一个功能强大、易用性强的REPL程序。

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

51CTO读书频道二维码


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

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

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

读 书 +更多

Linux环境下C编程指南

本书系统地介绍了在Linux平台下用C语言进行程序开发的过程,通过列举大量的程序实例,使读者很快掌握在Linux平台下进行C程序开发的方法和技...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊