用於構建優秀命令行的 4 個 Python 庫
這是我的終端應用程序與偉大的命令行界面系列文章中的兩部分。在第一篇中,我討論了使命令行應用程序成為一種純粹為個人喜好的功能。在本文中,我將介紹如何在幾個庫的幫助下,在 Python 中實現這些功能。讀完後,讀者會了解到如何使用 Prompt Toolkit, Click(命令行界面創建工具包)、Pygments 和 Fuzzy Finder 來實現一個易於使用的 REPL。
我計劃在不到 20 行的 Python 代碼中實現這一點。讓我們開始吧。
加qq群813622576免費領取Python學習資料
Python Prompt 工具
我認為這個庫作為命令行應用的瑞士軍刀——它扮演了readline
我們將從一個簡單的 REPL 開始。典型的 REPL 能接收用戶的輸入,進行一個操作之後再打印結果。我們這裏創建一個“echo”的 REPL 。用戶輸入什麽它就打印什麽:
REPL
以上便實現了一個 REPL。它可以讀取用戶的輸入並輸出用戶輸入的內容。在這個代碼片段中的 prompt 函數來自於 prompt_toolkit 庫;它被用來替換 readline 庫。
歷史
為了增強我們的 REPL,我們可以添加命令歷史:
我們剛剛向REPL添加了持久的歷史記錄。 現在我們可以使用向上/向下箭頭瀏覽歷史記錄,並使用Ctrl + R搜索歷史。 這符合命令行的基本禮儀。
自動聯想
我在第一部分中介紹的可發現性技巧之一是自動聯想歷史命令。(我們看到這個功能在fish shell中開創了。)讓我們把這個功能添加到我們的REPL中:
我們需要做的只是在 prompt() API調用中添加一個新的參數。現在我們有了一個具有fish風格歷史自動聯想的 REPL。
自動補全
現在,讓我們通過自動補全功能來實現 Tab 補全,它會在用戶輸入過程中彈出參考項。
可是 REPL 怎麽知道給出哪些參考項呢?我們提供了一個可選條目的字典,用來給出提示。
以 SQL 的自動補全為例,來看看怎麽在 REPL 中實現吧。我們可以將 SQL 關鍵字存儲到自動補全字典。具體如下:
和上一節類似,我們簡單的使用了 prompt-toolkit 中叫 WordCompleter
現在我們的 REPL 實現了自動補全、fish 風格歷史自動聯想,以及 up/down 鍵回顧輸入歷史。所有這些功能的實現只用了不到 10 行代碼。
Click
Click是一個命令行創建工具包,可以方便地解析程序的命令行選項和參數。 本節不介紹如何使用Click作為參數解析器; 相反,我將談一些Click附帶的一些實用程序。
click 安裝很簡單:
Pager
Pager 是能將長輸出一次顯示在一個頁面上的 Pagers Unix 實用程序。它可以通過調節顯示較少,更多,最多等。通過 pager 顯示命令的輸出不僅僅設計友好,而且相得益彰。
我們進一步來看前面的示例,可以用 click.echo_via_pager() 來取代默認的 print() 語句。它會通過 pager 將輸出發送到 stdout。這與平臺無關,所以可以在 Unix 或 Windows 中工作。 而且 click.echo_via_pager() 還會通過使用合適的默認值以在必要時顯示彩色代碼:
rom prompt_toolkit import promptfrom prompt_toolkit.history import FileHistoryfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistoryfrom prompt_toolkit.contrib.completers import WordCompleterimport 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)
Editor
我上一篇文章中提到的一個細節是,當命令變得太過復雜時,就需要使用編輯器了。而 click 有一個簡單的 API 可以用來啟動一個編輯器,並將在編輯器中輸入的文本返回到應用程序中:
Fuzzy Finder
Fuzzy Finder 是一種讓用戶用更少的按鍵減少代碼提示的方式。然後,有一個類庫實現了 Fuzzy Finder。讓我們來安裝它:
Fuzzy Finder 的 API 非常簡單。您只要傳遞部分字符串和可能的選擇列表,Fuzzy Finder 就會根據相關性順序排列通過模糊算法返回與之匹配的新列表。例如:
現在我們有了 FuzzyFinder,我們將其添加到我們的 SQL REPL 中。 我們這樣做是為了定義一個自定義完成器,而不是 prompt-toolkit 附帶的 WordCompleter。例如:
Pygments
現在讓我們為用戶輸入添加語法高亮,當我們在使用 SQL REPL 的時候,擁有彩色的 SQL 輸入將會非常棒。
Pygments 是一個語法高亮庫,它內置支持 300 多種語言。添加語法高亮後可以讓程序更加多彩,而且還能幫助用戶在執行 SQL 之前找到錯誤,例如輸入錯誤、不匹配的引號或者括號。
先安裝 Pygments:
然後使用 Pygments 為我們的 SQL REPL 來添加顏色:Pygments 庫能在 Prompt 工具上很好地工作。我們把 Pygments 提供的的 SqlLexer 傳入到 prompt API。現在所有用戶輸入都會被當做 SQL 語句,並能為其添加合適的顏色。
結語
通過創建一個功能強大的 REPL,它包括諸如歷史記錄、鍵盤綁定等全部通用 shell 功能和用戶友好的功能,如自動完成、模糊查找、pager 支持、編輯器支持和語法高亮。我們用不到 20 個 Python 語句實現了所有這些。
加vx;tanzhouyiwan免費領取Python學習資料
用於構建優秀命令行的 4 個 Python 庫