優れたコマンドライン インターフェイスを備えたターミナル プログラムに関するこの 2 部構成シリーズの 2 番目のチュートリアルでは、プロンプト、ツールキット、クリック、Pygments、およびファジー ファインダーについて説明します。
これは、優れたコマンド ライン インターフェイスを備えたターミナル プログラムに関する 2 部構成のシリーズの 2 番目のチュートリアルです。最初の記事では、コマンド ライン アプリケーションを使いやすくする機能のいくつかについて説明しました。この 2 番目の記事では、Python のライブラリの一部を使用してこれらの機能を実装する方法を見ていきます。
20 行未満の Python コードで実装する予定です。はじめましょう。
Python プロンプト ツールキット私はこのライブラリをコマンド ライン アプリケーションのスイス アーミー ナイフと呼ぶことに慣れており、readline、curses などの代替として使用できます。まずこのライブラリをインストールしてから、チュートリアルを開始しましょう:
リーリー簡単な REPL (LCTT アノテーション: REPL - Read-Eval-Print Loop、対話型開発環境) から始めます。一般的な REPL は、ユーザー入力を受け取り、操作を実行し、結果を出力します。たとえば、この例では、「エコー」機能を備えた REPL を実装します。ユーザーの入力をそのまま出力するだけです:
REPL リーリーこれが REPL を実装するためのコードのすべてです。ユーザーの入力を読み取り、ユーザーの入力を出力します。このコードで使用されているプロンプト関数は、readline ライブラリの代わりとなる、prompt_toolkit ライブラリからのものです。
コマンド履歴REPL の機能を強化するために、コマンド履歴を追加できます:
リーリー永続的なコマンド履歴を REPL に追加しました。これで、上/下矢印を使用してコマンド履歴を参照し、Ctrl-R を使用してコマンド履歴を検索できるようになります。コマンドラインの基本ガイドラインを満たしています。
自動推奨最初のチュートリアルで、私が説明した検出可能性テクニックの 1 つは、履歴コマンドを自動的に推奨することでした。 (私はこの機能を fish Shell で初めて知りました) この機能を REPL に追加しましょう:
リーリーprompt() API 呼び出しに新しいパラメータを追加するだけです。これで、歴史的なコマンドを自動的に推奨する Fish Shell スタイルの REPL が完成しました。
オートコンプリート次に、オートコンプリートを使用してタブ補完を強化しましょう。ユーザーが入力を開始すると、考えられるコマンドの推奨事項がポップアップ表示されます。
REPL 推奨事項を作成するにはどうすればよいですか?辞書を使用して、候補となるアイテムを推奨します。
たとえば、SQL の REPL を実装してみましょう。 SQL キーワードをオートコンプリート辞書に保存できます。これがどのように行われるかを見てみましょう:
リーリー繰り返しになりますが、prompt-toolkit の組み込み補完機能 WordCompleter を使用して、ユーザー入力と推奨される辞書を照合し、リストを提供しました。
これで、オートコンプリート、フィッシュシェルスタイルの履歴コマンド推奨機能、および上下の閲覧履歴を備えた REPL が完成しました。これらの機能の実装に必要な実際のコードは 10 行未満でした。
###クリック### Click は、プログラムのコマンド ライン オプションのパラメーターと定数を簡単に解析できるようにするコマンド ライン作成ツールキットです。ここでは、Click をパラメーター パーサーとして使用する方法については説明しません。代わりに、Click に付属する機能のいくつかを見てみましょう。クリックしてインストール:
リーリーPaginator は、非常に長い出力を一度に 1 ページずつ表示できる Unix システム上のユーティリティです。ポケベルの例には、少ない、多い、多いなどがあります。ページャーを介してコマンドの出力を表示することは、使いやすい設計であるだけでなく、必須でもあります。
让我们进一步改进前面的例子。我们不再使用默认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 。让我们首先安装这个库:
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)
现在,让我们给用户输入添加语法高亮。我们正在搭建一个 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 中国語 Web サイトの他の関連記事を参照してください。