>  기사  >  시스템 튜토리얼  >  고품질 Python 명령줄 사용자 인터페이스를 구축하기 위한 라이브러리

고품질 Python 명령줄 사용자 인터페이스를 구축하기 위한 라이브러리

WBOY
WBOY앞으로
2024-01-17 11:27:211361검색

훌륭한 명령줄 인터페이스를 갖춘 터미널 프로그램에 관한 두 부분으로 구성된 시리즈의 두 번째 튜토리얼에서는 Prompt, Toolkit, Click, Pygments 및 Fuzzy Finder에 대해 논의하겠습니다.
如何构建优秀的命令行用户界面的 Python 库

이것은 훌륭한 명령줄 인터페이스를 갖춘 터미널 프로그램에 관한 두 부분으로 구성된 시리즈 중 두 번째 튜토리얼입니다. 첫 번째 기사에서는 명령줄 응용 프로그램을 즐겁게 사용할 수 있게 해주는 몇 가지 기능에 대해 논의했습니다. 이 두 번째 기사에서는 일부 Python 라이브러리를 사용하여 이러한 기능을 구현하는 방법을 살펴보겠습니다.

20줄 이내의 Python 코드로 구현할 예정입니다. 시작하자.

Python 프롬프트 툴킷

저는 이 라이브러리를 명령줄 응용 프로그램의 Swiss Army Knife라고 부르는 데 익숙합니다. 이 라이브러리는 readline, 욕설 등을 대체하는 데 사용할 수 있습니다. 먼저 이 라이브러리를 설치한 다음 튜토리얼을 시작해 보겠습니다.

으아아아

우리는 간단한 REPL(LCTT Annotation: REPL - Read-Eval-Print Loop, 대화형 개발 환경)로 시작합니다. 일반적인 REPL은 사용자 입력을 받아 작업을 수행하고 결과를 출력합니다. 예를 들어, 이 예에서는 "에코" 기능을 사용하여 REPL을 구현하겠습니다. 사용자의 입력을 있는 그대로 출력합니다:

REPL 으아아아

REPL을 구현하기 위한 모든 코드입니다. 사용자의 입력을 읽은 다음 사용자의 입력을 인쇄합니다. 이 코드에 사용된 프롬프트 기능은 readline 라이브러리를 대체하는 프롬프트_toolkit 라이브러리에서 제공됩니다.

명령 기록

REPL의 기능을 향상시키기 위해 명령 기록을 추가할 수 있습니다.

으아아아

REPL에 영구 명령 기록을 추가했습니다. 이제 위쪽/아래쪽 화살표를 사용하여 명령 기록을 탐색하고 Ctrl-R을 사용하여 명령 기록을 검색할 수 있습니다. 이는 명령줄의 기본 지침을 충족합니다.

자동 추천

첫 번째 튜토리얼에서 제가 이야기한 검색 가능성 기술 중 하나는 자동으로 기록 명령을 추천하는 것이었습니다. (저는 이 기능을 fish shell에서 처음 보았습니다.) REPL에 이 기능을 추가해 보겠습니다.

으아아아

prompt() API 호출에 새 매개변수를 추가하기만 하면 됩니다. 이제 과거 명령을 자동으로 추천하는 생선 껍질 스타일 REPL이 생겼습니다.

자동완성

이제 자동완성으로 탭 완성 기능을 강화해 보겠습니다. 사용자가 입력을 시작하면 가능한 명령 권장 사항이 팝업으로 표시됩니다.

REPL을 추천하는 방법은 무엇인가요? 우리는 가능한 항목을 추천하기 위해 사전을 사용합니다.

예를 들어 SQL용 REPL을 구현해 보겠습니다. 자동 완성 사전에 SQL 키워드를 저장할 수 있습니다. 이것이 어떻게 작동하는지 봅시다:

으아아아

다시 말하지만, 우리는 WordCompleter라는 prompt-toolkit에 내장된 완성 기능을 사용했습니다. 이 기능은 사용자 입력을 가능한 권장 사전과 일치시키고 목록을 제공합니다.

이제 자동 완성, 피시 쉘 스타일의 기록 명령 권장 사항, 탐색 기록 위/아래를 갖춘 REPL이 있습니다. 이러한 기능을 구현하는 데에는 실제 코드가 10줄도 채 걸리지 않았습니다.

클릭

Click은 프로그램의 명령줄 옵션 매개변수와 상수를 더 쉽게 구문 분석할 수 있게 해주는 명령줄 생성 도구 키트입니다. 여기에서는 Click을 매개변수 파서로 사용하는 방법에 대해 논의하지 않습니다. 대신 Click에 포함된 일부 기능을 살펴보겠습니다.

설치 클릭:

으아아아

페이지네이터는 매우 긴 출력을 한 번에 한 페이지씩 표시할 수 있는 Unix 시스템의 유용한 도구입니다. 호출기의 예로는 less, more, maximum 등이 있습니다. 호출기를 통해 명령의 출력을 표시하는 것은 친숙한 디자인일 뿐만 아니라 필수 사항이기도 합니다.

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

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


위 내용은 고품질 Python 명령줄 사용자 인터페이스를 구축하기 위한 라이브러리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 linuxprobe.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제