当前位置: 首页 > 科技观察

四个Python库,实现超实用的命令行功能

时间:2023-03-17 20:48:51 科技观察

四个Python库,用于提供非常有用的命令行功能工具包、“Pygments”和“模糊搜索”。这是我的两部分系列的第二部分具有出色命令行界面的终端应用程序。在第一篇文章中,我介绍了几个使使用命令行程序变得有趣的特性。在第二部分中,我将展示如何在几个Python库的帮助下实现这些功能。到本文结束时,读者应该对如何实现一个简单的-使用PromptToolkit、Click(命令行界面创建工具包)、Pygments和FuzzyFinder来使用REPL(交互式解释器)。我计划用不到20行Python代码来做到这一点。让我们开始吧。PythonPromptToolkitI喜欢将此库视为可以替代readline、curses等的命令行应用程序的瑞士军刀。让我们安装此库并开始使用:pipinstallprompt_toolkit我们将从一个简单的REPL开始。通常REPL将接受用户输入,执行操作并打印结果。对于我们的示例,我们将构建一个“echo”REPL。它只是打印出用户输入的内容:interactiveinterpreterfromprompt_toolkitimportpromptwhile1:user_input=prompt('>')print(user_input)这就是实现REPL所需的全部内容。它可以读取用户输入并打印输入的内容。此代码段中使用的提示函数来自prompt_toolkit库;它是readline库的替代品。历史为了增强我们的REPL,我们可以添加历史命令:fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistorywhile1:user_input=prompt('>',history=FileHistory('history.txt'),)print(user_input)我们刚刚添加了persistent到REPL历史记录.现在我们可以使用向上/向下箭头浏览历史,使用Ctrl+R搜索历史。这符合命令行的基本习惯用法。自动建议我在第1部分中介绍的技巧之一是自动建议历史命令。(我们看到这个功能首先在Fishshell中推出。)让我们将这个功能添加到我们的REPL中:),)print(user_input)我们只需要向prompt()API调用添加一个新参数。现在我们的REPL已经可以像FishShell一样支持历史命令的自动提示功能了。自动完成现在我们使用Tab增强功能实现自动完成功能,它会在用户开始输入时弹出可能的建议。我们的REPL如何知道要给出什么提示?我们提供了可能的名称提示的字典。假设我们正在为SQL实现一个REPL。我们可以使用SQL关键字存储我们的自动完成字典。让我们看看如何做到这一点:fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.contrib.completersimportWordCompleterSQLCompleter=WordCompleter(['select','from','insert','opdate']True)while1,t_input=promptSQL'=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter,)print(user_input)同样,我们只使用WordCompleter提示工具包的内置例程,将用户输入与可能的字典匹配提示并提供一个列表。我们现在有一个带有自动完成、鱼式历史提示和上下浏览命令历史的REPL。所有这些都在不到10行的实际代码中完成。命令行界面创建工具包Click是一个命令行创建工具包,可以轻松解析程序命令行选项和参数。本节不描述如何使用Click作为参数解析器;相反,我将检查Click库的一些其他功能。安装click很容易pipinstallclickPagerPager是Unix上的一个实用程序,用于一次性显示长输出。寻呼机包括一些less、more、most等。通过寻呼机显示命令不仅是一种友好的设计,而且是必需的。让我们把上面的例子更进一步。我们可以使用click.echo_via_pager()而不是默认的print()语句。这将通过寻呼机将输出通过管道传输到stdout,它与平台无关,因此可以在Windows或Unix上运行。click.echo_via_pager()将尝试用默认的分页器来输出,以便在需要的时候显示有颜色的代码:fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.contrib.completersimportWordCompleterimportclickSQLCompleter=WordCompleter(['select','from','insert','update','delete','drop'],ignore_case=True)while1:user_input=prompt(u'SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter,)click.echo_via_pager(user_input)编辑器在我之前的文章中提到了一个细节,就是当命令变得过于复杂时,它会返回给编辑器。同样的点击提供了一个简单的API来启动编辑器,并将在编辑器中输入的文本返回给应用程序:importclickmessage=click.edit()模糊搜索模糊搜索是一种让用户用最少的输入来缩小提示范围的方法。还有一个模糊搜索库,让我们安装这个库:pipinstallfuzzyfinder模糊搜索API很简单,你传入一个部分字符串和一个可能的选择列表,模糊搜索会返回一个新的列表,这与匹配排序后的模糊算法字符串,例如:>>>fromfuzzyfinderimportfuzzyfinder>>>suggestions=fuzzyfinder('abc',['abcd','defabca','aagbec','xyz','qux'])>>>list(suggestions)['abcd','defabca','aagbec']现在我们有了模糊搜索,让我们把它添加到我们的SQL交互式解释器中。这定义了一个完成器,而不是prompt-toolkit附带的WordCompleter。例如:fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportCompleter,CompletionimportclickfromfuzzyfinderimportfuzzyfinderSQLKeywords=['select','from','insert','update','delete','drop']classSQLCompleter(Completer):defget_completions(self,document,complete_event):word_before_cursor=document.get_word_before_cursor(WORD=True)matches=fuzzyfinder(word_before_cursor,SQLKeywords)forminmatches:yieldCompletion(m,start_position=-len(word_before_cursor))while1:user_input=prompt(u'SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter(),)click.echo_via_pager(user_input)Pygments现在让我们为用户输入添加语法高亮。我们正在构建一个SQL交互式解释器,如果有彩色SQL语句会很好。Pygments是一个语法高亮库,内置支持300多种语言。添加语法突出显示可以使应用程序进行颜色编码,帮助用户在执行SQL之前发现拼写错误或不匹配的引号和括号等问题。首先安装Pygmentspipinstallpygments让我们用pygments给我们的SQL交互式解释器添加颜色:fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportCompleter,Completionimportclickfromfuzzyfinderimportfuzzyfinderfrompygments.lexers.sqlimportSqlLexerSQLKeywords=['select','from','insert','update','delete','drop']classSQLCompleter(Completer):defget_completions(self,document,complete_event):word_before_cursor=document.get_word_before_cursor(WORD=True)匹配=fuzzyfinder(word_before_cursor,SQLKeywords)forminmatches:yieldCompletion(m,start_position=-len(word_before_cursor))while1:user_input=prompt(u'SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter(),lexer=SqlLexer,)click.echo_via_pager(user_input)提示Toolkit与Pygments库配合使用。我们选择Pygments提供的SqlLexer,从提示工具包中传给API。所有用户输入现在都被视为SQL并带有颜色。结论我们工作的结论是创建一个功能强大的交互式解释器,它具有常见shell的所有功能,例如历史记录、键绑定,以及非常友好的自动完成、模糊搜索、寻呼机、编辑器和语法高亮功能。我们用不到20条python语句实现了所有这些。这不是很容易吗?现在为什么不能编写一个好的命令行应用程序,这里有一些资源可能会有所帮助:单击(命令行界面创建工具包)模糊搜索提示工具包请参阅提示工具包教程和提示工具包Pygments中的示例2017年5月20日,AmjithRamanujam在俄勒冈州波特兰举行的PyConUSA2017上发表了名为《超棒的命令行工具》的演讲。您可以在本次演讲中了解更多信息。