Maison > Article > Tutoriel système > Une bibliothèque pour créer des interfaces utilisateur en ligne de commande Python de haute qualité
Dans ce deuxième didacticiel d'une série en deux parties sur les programmes de terminal dotés d'excellentes interfaces de ligne de commande, nous aborderons Prompt, Toolkit, Click, Pygments et Fuzzy Finder.
Il s'agit du deuxième tutoriel de ma série en deux parties sur les programmes de terminaux dotés d'excellentes interfaces de ligne de commande. Dans le premier article, nous avons abordé certaines des fonctionnalités qui rendent les applications en ligne de commande agréables à utiliser. Dans ce deuxième article, nous verrons comment implémenter ces fonctionnalités à l’aide de certaines bibliothèques Python.
Je prévois de l'implémenter en moins de 20 lignes de code Python. commençons.
Boîte à outils d'invite PythonJ'ai l'habitude d'appeler cette bibliothèque le couteau suisse des applications en ligne de commande, elle peut être utilisée en remplacement de readline, Curses, etc. Commençons par installer cette bibliothèque puis commençons le tutoriel :
pip install prompt_toolkit
Nous commençons par un simple REPL (LCTT Annotation : REPL - Read-Eval-Print Loop, environnement de développement interactif). Un REPL typique reçoit les entrées de l'utilisateur, effectue une opération et génère le résultat. Par exemple, dans notre exemple, nous allons implémenter un REPL avec une fonctionnalité "echo". Il imprime simplement la saisie de l'utilisateur telle quelle :
REPLfrom prompt_toolkit import prompt while 1: user_input = prompt('>') print(user_input)
Voici tout le code pour implémenter REPL. Il lit l'entrée de l'utilisateur, puis imprime l'entrée de l'utilisateur. La fonction d'invite utilisée dans ce code provient de la bibliothèque prompt_toolkit, qui remplace la bibliothèque readline.
Historique des commandesPour améliorer les fonctionnalités de notre REPL, nous pouvons ajouter l'historique des commandes :
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory while 1: user_input = prompt('>', history=FileHistory('history.txt'), ) print(user_input)
Nous venons d'ajouter un historique de commandes persistant au REPL. Nous pouvons maintenant utiliser les flèches haut/bas pour parcourir l'historique des commandes et Ctrl-R pour rechercher l'historique des commandes. Il répond aux directives de base de la ligne de commande.
Recommandation automatiqueDans le premier tutoriel, l'une des techniques de découvrabilité dont j'ai parlé consistait à recommander automatiquement des commandes historiques. (J'ai vu cette fonctionnalité pour la première fois dans la coquille de poisson) Ajoutons cette fonctionnalité à notre REPL :
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory while 1: user_input = prompt('>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), ) print(user_input)
Nous avons juste besoin d'ajouter un nouveau paramètre à l'appel API prompt(). Nous avons maintenant un REPL de style coquille de poisson qui recommande automatiquement les commandes historiques.
Saisie automatiqueMaintenant, améliorons la complétion des onglets avec Autocomplete. Il affiche des recommandations de commandes possibles lorsque l'utilisateur commence à taper.
Comment recommander REPL ? Nous utilisons un dictionnaire pour recommander des éléments possibles.
Par exemple, implémentons un REPL pour SQL. Nous pouvons stocker des mots-clés SQL dans le dictionnaire de saisie semi-automatique. Voyons comment cela fonctionne :
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.contrib.completers import WordCompleter SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'], ignore_case=True) while 1: user_input = prompt('SQL>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), completer=SQLCompleter, ) print(user_input)
Encore une fois, nous avons simplement utilisé une fonctionnalité de complétion intégrée à prompt-toolkit appelée WordCompleter, qui fait correspondre les entrées de l'utilisateur avec d'éventuels dictionnaires recommandés et fournit une liste.
Nous avons maintenant un REPL avec saisie semi-automatique, recommandations de commandes historiques de style coquille de poisson et historique de navigation haut/bas. La mise en œuvre de ces fonctionnalités a nécessité moins de 10 lignes de code réel.
CliquezClick est une boîte à outils de création de ligne de commande qui facilite l'analyse des paramètres et des constantes des options de ligne de commande pour les programmes. Nous ne discuterons pas ici de la façon d’utiliser Click comme analyseur de paramètres. Au lieu de cela, nous examinerons certaines des fonctionnalités fournies par Click.
Cliquez sur l'installation :
pip install click
Les paginateurs sont des outils utiles sur les systèmes Unix, capables d'afficher de très longues sorties, une page à la fois. Quelques exemples de téléavertisseurs incluent moins, plus, la plupart, etc. Afficher le résultat d'une commande via un téléavertisseur n'est pas seulement une conception conviviale, mais aussi une nécessité.
让我们进一步改进前面的例子。我们不再使用默认print()语句,取而代之的是click.echo_via_pager()。它将会把输出通过分页器发送到标准输出。这是平台无关的,因此在 Unix 系统或 Windows 系统上均能工作。如果必要的话,click_via_pager 会尝试使用一个合适的默认分页器来输出,从而能够显示代码高亮。
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.contrib.completers import WordCompleter import click SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'], ignore_case=True) while 1: user_input = prompt(u'SQL>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), completer=SQLCompleter, ) click.echo_via_pager(user_input)编辑器
在我前面的文章中一个值得一提的细节是,当命令过于复杂的时候进入编辑器来编辑。Click 有一个简单的 API 能够打开编辑器,然后把在编辑器中输入的文本返回给应用。
import click message = click.edit()Fuzzy Finder
Fuzzy Finder 是一种通过少量输入来为用户减少推荐的方法。幸运的是,有一个库可以实现 Fuzzy Finder 。让我们首先安装这个库:
pip install fuzzyfinder
Fuzzy Finder的 API 很简单。用户向它传递部分字符串和一系列可能的选择,然后,Fuzzy Finder将会返回一个与部分字符串匹配的列表,这一列表是通过模糊算法根据相关性排序得出的。比如:
>>> from fuzzyfinder import fuzzyfinder >>> suggestions = fuzzyfinder('abc', ['abcd', 'defabca', 'aagbec', 'xyz', 'qux']) >>> list(suggestions) ['abcd', 'defabca', 'aagbec']
现在我们有了fuzzyfinder>,让我们把它加入到我们的 SQL REPL 中。方法是我们自定义一个completer而不是使用来自prompt-toolkit库的WordCompleter。比如:
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.completion import Completer, Completion import click from fuzzyfinder import fuzzyfinder SQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop'] class SQLCompleter(Completer): def get_completions(self, document, complete_event): word_before_cursor = document.get_word_before_cursor(WORD=True) matches = fuzzyfinder(word_before_cursor, SQLKeywords) for m in matches: yield Completion(m, start_position=-len(word_before_cursor)) while 1: user_input = prompt(u'SQL>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), completer=SQLCompleter(), ) click.echo_via_pager(user_input)Pygments
现在,让我们给用户输入添加语法高亮。我们正在搭建一个 SQL REPL,如果具有彩色高亮的 SQL 语句,这会很棒。
Pygments是一个提供语法高亮的库,内建支持超过 300 种语言。添加语法高亮能够使应用变得彩色化,从而能够帮助用户在执行程序前发现 SQL 中存在的错误,比如拼写错误、引号不匹配或括号不匹配。
首先,安装Pygments:
pip install pygments
让我们使用Pygments来为 SQL REPL 添加颜色:
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistory from prompt_toolkit.completion import Completer, Completion import click from fuzzyfinder import fuzzyfinder from pygments.lexers.sql import SqlLexer SQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop'] class SQLCompleter(Completer): def get_completions(self, document, complete_event): word_before_cursor = document.get_word_before_cursor(WORD=True) matches = fuzzyfinder(word_before_cursor, SQLKeywords) for m in matches: yield Completion(m, start_position=-len(word_before_cursor)) while 1: user_input = prompt(u'SQL>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), completer=SQLCompleter(), lexer=SqlLexer, ) click.echo_via_pager(user_input)
Prompt Toolkit能够和Pygments一同很好的工作。我们把Pygments提供的SqlLexer加入到来自prompt-toolkit的prompt中。现在,所有的用户输入都会被当作 SQL 语句,并进行适当着色。
结论我们的“旅途”通过创建一个强大的 REPL 结束,这个 REPL 具有常见的 shell 的全部特性,比如历史命令,键位绑定,用户友好性比如自动补全、模糊查找、分页器支持、编辑器支持和语法高亮。我们仅用少于 20 行 Python 代码就实现了这个 REPL 。
不是很简单吗?现在,你没有理由不会写一个自己的命令行应用了。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!