Maison > Tutoriel système > Linux > le corps du texte

Une bibliothèque pour créer des interfaces utilisateur en ligne de commande Python de haute qualité

WBOY
Libérer: 2024-01-17 11:27:21
avant
1359 Les gens l'ont consulté

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.
如何构建优秀的命令行用户界面的 Python 库

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 Python

J'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
Copier après la connexion

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 :

REPL
from prompt_toolkit import prompt

while 1:
    user_input = prompt('>')
    print(user_input)
Copier après la connexion

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 commandes

Pour 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)
Copier après la connexion

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 automatique

Dans 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)
Copier après la connexion

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 automatique

Maintenant, 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)
Copier après la connexion

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.

Cliquez

Click 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
Copier après la connexion

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)
Copier après la connexion
编辑器

在我前面的文章中一个值得一提的细节是,当命令过于复杂的时候进入编辑器来编辑。Click 有一个简单的 API 能够打开编辑器,然后把在编辑器中输入的文本返回给应用。

import click
message = click.edit()
Copier après la connexion
Fuzzy Finder

Fuzzy Finder 是一种通过少量输入来为用户减少推荐的方法。幸运的是,有一个库可以实现 Fuzzy Finder 。让我们首先安装这个库:

pip install fuzzyfinder
Copier après la connexion

Fuzzy Finder的 API 很简单。用户向它传递部分字符串和一系列可能的选择,然后,Fuzzy Finder将会返回一个与部分字符串匹配的列表,这一列表是通过模糊算法根据相关性排序得出的。比如:

>>> from fuzzyfinder import fuzzyfinder

>>> suggestions = fuzzyfinder('abc', ['abcd', 'defabca', 'aagbec', 'xyz', 'qux'])

>>> list(suggestions)
['abcd', 'defabca', 'aagbec']
Copier après la connexion

现在我们有了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)
Copier après la connexion
Pygments

现在,让我们给用户输入添加语法高亮。我们正在搭建一个 SQL REPL,如果具有彩色高亮的 SQL 语句,这会很棒。

Pygments是一个提供语法高亮的库,内建支持超过 300 种语言。添加语法高亮能够使应用变得彩色化,从而能够帮助用户在执行程序前发现 SQL 中存在的错误,比如拼写错误、引号不匹配或括号不匹配。

首先,安装Pygments:

pip install pygments
Copier après la connexion

让我们使用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)
Copier après la connexion

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!

source:linuxprobe.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal