Heim  >  Artikel  >  System-Tutorial  >  Eine Bibliothek zum Erstellen hochwertiger Python-Befehlszeilen-Benutzeroberflächen

Eine Bibliothek zum Erstellen hochwertiger Python-Befehlszeilen-Benutzeroberflächen

WBOY
WBOYnach vorne
2024-01-17 11:27:211302Durchsuche

In diesem zweiten Tutorial einer zweiteiligen Serie über Terminalprogramme mit großartigen Befehlszeilenschnittstellen besprechen wir Prompt, Toolkit, Click, Pygments und Fuzzy Finder.
如何构建优秀的命令行用户界面的 Python 库

Dies ist das zweite Tutorial meiner zweiteiligen Serie über Terminalprogramme mit tollen Befehlszeilenschnittstellen. Im ersten Artikel haben wir einige der Funktionen besprochen, die die Verwendung von Befehlszeilenanwendungen zu einem Vergnügen machen. In diesem zweiten Artikel schauen wir uns an, wie man diese Funktionen mithilfe einiger Python-Bibliotheken implementiert.

Ich habe vor, es in weniger als 20 Zeilen Python-Code zu implementieren. Lasst uns beginnen.

Python Prompt Toolkit

Ich bin es gewohnt, diese Bibliothek das Schweizer Taschenmesser der Befehlszeilenanwendungen zu nennen. Sie kann als Ersatz für Readline, Curses usw. verwendet werden. Lassen Sie uns zunächst diese Bibliothek installieren und dann mit dem Tutorial beginnen:

pip install prompt_toolkit

Wir beginnen mit einem einfachen REPL (LCTT Annotation: REPL – Read-Eval-Print Loop, interaktive Entwicklungsumgebung). Eine typische REPL empfängt Benutzereingaben, führt eine Operation aus und gibt das Ergebnis aus. In unserem Beispiel werden wir beispielsweise eine REPL mit „Echo“-Funktionalität implementieren. Es druckt einfach die Eingabe des Benutzers so aus, wie sie ist:

REPL
from prompt_toolkit import prompt

while 1:
    user_input = prompt('>')
    print(user_input)

Dies ist der gesamte Code zur Implementierung von REPL. Es liest die Eingaben des Benutzers und druckt sie dann aus. Die in diesem Code verwendete Prompt-Funktion stammt aus der prompt_toolkit-Bibliothek, die einen Ersatz für die readline-Bibliothek darstellt.

Befehlsverlauf

Um die Funktionalität unserer REPL zu verbessern, können wir den Befehlsverlauf hinzufügen:

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory

while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                       )
    print(user_input)

Wir haben der REPL gerade einen dauerhaften Befehlsverlauf hinzugefügt. Jetzt können wir die Aufwärts-/Abwärtspfeile verwenden, um den Befehlsverlauf zu durchsuchen, und Strg-R, um den Befehlsverlauf zu durchsuchen. Es entspricht den grundlegenden Richtlinien der Befehlszeile.

Automatische Empfehlung

Im ersten Tutorial war eine der Auffindbarkeitstechniken, über die ich gesprochen habe, die automatische Empfehlung historischer Befehle. (Ich habe diese Funktion zum ersten Mal in der Fischmuschel gesehen) Fügen wir diese Funktion zu unserem REPL hinzu:

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)

Wir müssen lediglich einen neuen Parameter zum API-Aufruf prompt() hinzufügen. Jetzt haben wir eine REPL im Fish-Shell-Stil, die automatisch historische Befehle empfiehlt.

Autovervollständigung

Jetzt verbessern wir die Tab-Vervollständigung mit Autocomplete. Sobald der Benutzer mit der Eingabe beginnt, werden mögliche Befehlsempfehlungen angezeigt.

Wie kann ich REPL empfehlen? Wir verwenden ein Wörterbuch, um mögliche Artikel zu empfehlen.

Lassen Sie uns zum Beispiel eine REPL für SQL implementieren. Wir können SQL-Schlüsselwörter im Autovervollständigungswörterbuch speichern. Mal sehen, wie das funktioniert:

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)

Auch hier haben wir einfach eine im prompt-toolkit integrierte Vervollständigungsfunktion namens WordCompleter verwendet, die Benutzereingaben mit möglichen empfohlenen Wörterbüchern abgleicht und eine Liste bereitstellt.

Jetzt haben wir eine REPL mit automatischer Vervollständigung, historischen Befehlsempfehlungen im Fish-Shell-Stil und einem Browserverlauf nach oben/unten. Die Implementierung dieser Funktionen erforderte weniger als 10 Zeilen tatsächlichen Code.

Klick

Click ist ein Toolkit zur Befehlszeilenerstellung, das das Parsen von Befehlszeilenoptionsparametern und -konstanten für Programme erleichtert. Wir werden hier nicht diskutieren, wie Click als Parameterparser verwendet wird. Stattdessen schauen wir uns einige der Funktionen an, mit denen Click ausgestattet ist.

Installieren Klicken Sie auf:

pip install click

Paginatoren sind nützliche Tools auf Unix-Systemen, die in der Lage sind, sehr lange Ausgaben Seite für Seite anzuzeigen. Einige Beispiele für Pager sind „weniger“, „mehr“, „am meisten“ usw. Die Anzeige der Ausgabe eines Befehls über einen Pager ist nicht nur ein benutzerfreundliches Design, sondern auch eine Notwendigkeit.

让我们进一步改进前面的例子。我们不再使用默认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 。

不是很简单吗?现在,你没有理由不会写一个自己的命令行应用了。


Das obige ist der detaillierte Inhalt vonEine Bibliothek zum Erstellen hochwertiger Python-Befehlszeilen-Benutzeroberflächen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:linuxprobe.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen