まだ手書きコマンドライン機能を持っていますか?この4つのPythonライブラリがどのように自動的に実現されるかを見てみましょう


コマンドラインプログラムを使用すると、「ヒントキット」、「コマンドラインインタフェース作成キット」、「Pygments」、「ファジイ検索」など、いくつかのPythonライブラリの助けでこれらの機能を実現する方法について説明します.
 本明細書の最後に、読者は、Prompt Toolkit、Click(コマンドラインインタフェース作成キット)、Pygments、およびFuzzy Finderを使用して、使いやすいREPL(インタラクティブ解釈器)を実現する方法をよく理解すべきである.
20行未満のPythonコードで実現する予定です. 
始めましょうGO!
Pythonヒントキット
私はこのライブラリをスイスのように見るのが好きです.×××readline、cursesなどに代わるコマンドラインアプリケーションを集約します.このライブラリをインストールして使用し始めましょう.
pip install prompt_toolkit

簡単なREPLから始めます.通常、REPLはユーザーの入力を受け入れ、操作を実行し、結果を印刷します.私たちの例では、「echo」REPLを構築します.ユーザーが入力した内容を印刷するだけです.
インタラクティブインタラクションインタプリタ
from prompt_toolkit import prompt
 
while 1:
    user_input = prompt('>')
    print(user_input)

これがREPLを実装するために必要です.ユーザーが入力した内容を読み取り、印刷できます.このコード・セグメントで使用されるプロンプト関数はprompt_toolkitライブラリから来ています.readlin eライブラリの代替者です.
履歴
REPLを強化するために、履歴コマンドを追加できます.
from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
 
while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                       )
    print(user_input)

REPLに永続的な履歴を追加したばかりです.履歴を上/下矢印で参照し、Ctrl+Rを使用して履歴を検索できます.これはコマンドラインの基本的な習慣に合っています.
自動プロンプト
私が第1部で紹介したテクニックの1つは、履歴コマンドを自動的に提示することです.(この機能が最初にFish shellで発売されたのを見ました.)この機能を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)

私たちはprompt()API呼び出しに新しいパラメータを追加するだけです.今、私たちのREPLはFish Shellのような履歴コマンド自動プロンプト機能をサポートすることができます.
自動補完
次に、Tabの強化によって自動補完を実現し、ユーザーが入力を開始すると、可能なアドバイスがポップアップされます.
私たちのREPLはどのようにしてどんなヒントを与えるかを知っていますか?私たちは可能な名目ヒントの辞書を提供しました.
SQLのREPLを実装しているとします.SQLキーワードを使用して、自動完了辞書を格納できます.これを行う方法を見てみましょう.
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)

再度、WordCompleterというprompt-toolkitという組み込みインスタンスを使用するだけで、ユーザー入力をプロンプト可能な辞書と一致させ、リストを提供します.
自動的に補完できるREPL、fish式の履歴ヒント、および履歴コマンドの上下参照があります.これらはすべて10行未満の実際のコードにあります.
コマンドラインインタフェース作成キット
Clickは、プログラムのコマンドラインオプションパラメータとパラメータを簡単に解析できるコマンドライン作成ツールパッケージです.このセクションでは、パラメータ解析器としてClickを使用する方法については説明しません.代わりに、いくつかのClickライブラリの他の機能について検討します.
clickのインストールは簡単です
pip install click

ページングマシン
ページングはUnix上で一度に長出力表示するためのユーティリティです.ページングにはless,more,mostなどが含まれています.ページング表示コマンドは友好的な設計だけでなく、必要です.
以上の例をさらに見てみましょう.デフォルトのprint()文の代わりにclick.echo_via_pager()を使用できます.これは、プラットフォームに関係なくページ分割器を介してstdoutに出力を渡すので、WindowsまたはUnixで実行できます.click.echo_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()

ファジイ検索
ファジイ検索は、ユーザーが最小限の入力でプロンプトを縮小するためのものです.同じようにファジイ検索ライブラリがあります.このライブラリをインストールします.
pip install fuzzyfinder

ファジイ検索のAPIは簡単で、一部の文字列と選択可能なリストに渡されます.ファジイ検索は新しいリストを返します.これは、依存性に基づいてソートされたファジイアルゴリズムを使用した文字列と一致します.たとえば、次のようになります.
>>> from fuzzyfinder import fuzzyfinder
 
>>> suggestions = fuzzyfinder('abc', ['abcd', 'defabca', 'aagbec', 'xyz', 'qux'])
 
>>> list(suggestions)
['abcd', 'defabca', 'aagbec']

ここでファジイ検索を行い、SQLインタラクティブ解釈器に追加します.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インタラクティブインタラクション解釈器を構築しており、色付きSQL文が良いです.
Pygmentsは300以上の言語をサポートする構文ハイライトライブラリです.構文ハイライトを追加すると、アプリケーションがカラーになります.SQLを実行する前に、タイピングエラーや一致しない引用符や括弧など、ユーザーが発見するのに役立ちます.
まずPygmentsをインストールします
pip install pygments

pygmentsでSQLインタラクティブ解釈器に色を追加します.
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)

ヒントツールパッケージはPygmentsライブラリに適しています.Pygmentsが提供するSqlLexerを選択し、ヒントツールパッケージからAPIに渡します.すべてのユーザー入力がSQL文として使用され、色が追加されました.
結論
今回の成果の結論は、履歴、キーバインド、および友好的な自動完了、ファジイ検索、ページング、エディタ、構文のハイライト機能など、一般的なshellのすべての機能を持つ強力なインタラクティブ解釈器を作成することによって達成されました.これらを20個未満のpython文で実現しました.
簡単ではないでしょうか.優れたコマンドラインアプリケーションが書けない理由はありませんか.ここには役に立つリソースがあります.
  • Click(コマンドラインインタフェース作成キット)
  • ファジイ検索
  • ヒントキット
  • Prompt Toolkitチュートリアルおよびprompt-toolkitの例
  • を参照してください.
  • Pygments

  • 2017年5月20日、Amjith Ramanujamはオレゴン州ポートランド市で開催されたアメリカ2017 PyCon大会で「素晴らしいコマンドラインツール」という講演を行いました.この講演でより多くの内容を知ることができます.
    コンパイラ:fighteryu
    テキストリンク:http://python.jobbole.com/87830/
    皆さんの勉強を便利にするために、私はマゴPython交流グループを設立しました.現在、グループ内には2000人以上の友达がいます.寂しい友达を勉強して一緒に游んでみてはいかがでしょうか.グループ番号:515237230