当前位置: 首页 > 后端技术 > Python

4个用于构建出色命令行用户界面的Python库

时间:2023-03-25 19:50:57 Python

这是我关于具有出色命令行用户界面的终端应用程序的两部分系列文章的第二部分。在第一部分中,我讨论了使命令行应用程序成为一种纯粹的使用乐趣的特性。在第二部分中,我将研究如何借助一些库在Python中实现这些功能。到本文结束时,读者应该对如何使用PromptToolkit、Click(命令行界面创建工具包)、Pygments和FuzzyFinder来实现易于使用的REPL有一个扎实的了解。我计划用不到20行Python代码实现这一目标。开始吧。PythonPromptToolkit我喜欢将此库视为命令行应用程序的瑞士军刀——readline、curses等的替代品。让我们安装这个库并开始使用它。pipinstallprompt_toolkit我们将从一个简单的REPL开始。通常,REPL接受用户输入、执行操作并打印结果。在我们的例子中,我们将设置一个“echo”REPL。它只是打印回用户输入的内容。REPLfromprompt_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)我们刚刚向REPL添加了持久历史。现在我们可以使用向上/向下箭头浏览历史,使用Ctrl+R搜索历史。这就满足了命令行的基本礼仪。自动建议我在第1部分中谈到的可发现性技巧之一是在历史记录中自动建议命令。(我们在fishshell中看到了这个功能。)让我们将这个功能添加到我们的REPL中。fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistorywhile1:user_input=prompt('>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(我们要做什么,打印)put(用户)就是给prompt()的API调用添加一个新的参数。现在我们有了一个REPL,带有fish-styleauto-suggestfromhistory。用户开始输入时的建议。我们的REPL如何知道要建议什么?我们提供了一个可能的建议项目的字典。假设我们正在实现一个SQLREPL。我们可以将SQL关键字存储在我们的自动完成字典中。让我们看看如何做这。从prompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportWordCompleterSQLCompleter=WordCompleter](['select','from','insert','update_c','True)while1:user_input=prompt('SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter,)print(user_input)同样,我们可以简单地使用prompt-工具包的内置完成器,称为WordCompleter,匹配用户输入可能的建议字典并提供列表。我们现在有一个REPL,它可以自动完成、来自历史的类似鱼的建议,以及历史的上/下遍历。所有这些都是在不到10行的实际代码中完成的。ClickClick是一个命令行创建工具包,可以轻松解析命令行选项参数和程序参数。本节不介绍如何使用Click作为参数解析器;相反,我将看一下Click附带的一些实用程序。安装Click很简单。pipinstallclickpagerpager是一个Unix实用程序,一次显示一页长的输出。调用者的示例有:less、more、most等。通过分页器显示命令的输出不仅是好的设计,也是体面的实践。让我们将前面的示例更进一步。我们可以使用click.echo_via_pager()而不是默认的print()语句。这将负责通过寻呼机将输出发送到标准输出。它是平台独立的,因此它可以在Unix或Windows中工作。click.echo_via_pager()将尝试使用合适的默认值以便能够在必要时显示颜色代码。fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportWordCompleterimportclickSQLCompleter=WordCompleter(['select','from','insert','update','delete','drop'],ignore_case=True)while1:user_input=prompt('SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter,)click.echo_via_pager(user_input)编辑了我之前的帖子提到的一个好处当命令变得太复杂时,您可以退回到编辑器。再次单击提供了一个简单的API来启动编辑器并将在编辑器中输入的文本返回给应用程序。typeclickmessage=click.edit()FuzzyFinderFuzzyFinder是一种让用户用最少的输入来缩小建议范围的方法。再一次,有一个库实现了FuzzyFinder。让我们安装这个库。pipinstallfuzzyfinderFuzzyFinder的API很简单。您传入一个部分字符串和一个可能选项列表,FuzzyFinder将返回一个新列表,该列表使用模糊算法按相关顺序匹配部分字符串。例如>>>fromfuzzyfinder.mainimportfuzzyfinder>>suggestions=fuzzyfinder('abc',['abcd','defabca','aagbec','xyz','qux'])>>list(sustips)['abcd','defabca','aagbec']现在我们有了fuzzyfinder,让我们把它添加到我们的SQLREPL中。我们这样做的方法是定义一个自定义完成器,而不是prompt-toolkit附带的**WordCompleter。比如说fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportCompleter,Completionimportclickfromfuzzyfinder.mainimportfuzzyfinderSQLKeywords=['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现在让我们为用户的输入添加语言法高亮。我们正在设置一个SQLREPL,如果有彩色SQL语句会很好。Pygments是一个语法高亮库,内置支持300多种语言。通过添加语法高亮功能丰富了应用程序,这有助于用户在执行SQL之前发现错误,例如拼写错误、不匹配的引号或括号。首先安装Pygments。pipinstallpygments让我们使用Pygments为我们的SQLREPL添加颜色。fromprompt_toolkitimportpromptfromprompt_toolkit.historyimportFileHistoryfromprompt_toolkit.auto_suggestimportAutoSuggestFromHistoryfromprompt_toolkit.completionimportCompleter,Completionimportclickfromfuzzyfinderimportfuzzyfinderfrompygments.lexers.sqlimportSqlLexerSQLfrom'select,'from',''更新','Delete','Abandon']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:输出完成(m,start_position=-len(word_before_cursor))而1:user_input=prompt(u'SQL>',history=FileHistory('history.txt'),auto_suggest=AutoSuggestFromHistory(),completer=SQLCompleter(),lexer=SqlLexer,)click.echo_via_pager(user_input)提示工具包与Pygments库配合良好。我们选择Pygments提供的SqlLexer,传入prompt-toolkit的prompt**API。所有用户输入现在都被视为SQL语句并被适当地着色。结语我们创建一个强大的REPL的旅程到此结束,它具有普通shell的所有功能,如历史记录、键绑定和用户友好的功能,如自动完成、模糊查找、调用者支持、编辑器支持和语法突出显示。我们用不到20条Python语句实现了所有这些。这不是很容易吗?现在您没有理由不编写出色的命令行应用程序。这些资源可能会有所帮助。单击(命令行界面创建工具包)FuzzyFinderPromptToolkit请参阅prompt-toolkit存储库中的PromptToolkit教程和示例。Pygments*在AmjithRamanujam于5月20日在俄勒冈州波特兰举行的PyConUS2017演讲AwesomeCommandlineTools中了解更多信息。