您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python怎么快速構建命令行用戶界面”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Python怎么快速構建命令行用戶界面”文章能幫助大家解決問題。
我習慣于把這個庫稱為命令行應用的瑞士軍刀,它可以作為readline、curses等的替代品。讓我們首先安裝這個庫,然后開始該教程:
pip install prompt_toolkit
我們以一個簡單的 REPL (LCTT 譯注:REPL —— Read-Eval-Print Loop,交互式開發環境)開始。一個典型的 REPL 會接收用戶的輸入,進行一個操作,然后輸出結果。比如在我們的例子中,我們將要實現一個具有 “回顯” 功能的 REPL 。它僅僅是原樣打印出用戶的輸入:
REPL
from prompt_toolkit import promptwhile 1: user_input = prompt('>') print(user_input)
這就是實現 REPL 的全部代碼。它可以讀取用戶的輸入,然后打印出用戶的輸入內容。在這段代碼中使用的prompt函數來自 prompt_toolkit庫,它是readline庫的一個替代品。
命令歷史
為了增強我們的 REPL 的功能,我們可以添加命令歷史:
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistorywhile 1: user_input = prompt('>', history=FileHistory('history.txt'), ) print(user_input)
我們剛剛給 REPL 添加了持久的命令歷史。現在,我們可以使用上/下箭頭來瀏覽命令歷史,并使用Ctrl-R來搜索命令歷史。它滿足了命令行的基本準則。
自動推薦
在第一篇教程中,我講到的一個可發現性技巧是自動推薦歷史命令。(我是首先在 fish shell 中看到的這一特性)讓我們把這一特性加入到我們的 REPL 中:
from prompt_toolkit import prompt from prompt_toolkit.history import FileHistory from prompt_toolkit.auto_suggest import AutoSuggestFromHistorywhile 1: user_input = prompt('>', history=FileHistory('history.txt'), auto_suggest=AutoSuggestFromHistory(), ) print(user_input)
我們只需要給prompt() API 調用添加一個新的參數。現在,我們有了一個具有fish shell風格的 REPL,它可以自動推薦歷史命令。
自動補全
現在,讓我們通過自動補全來加強 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)
再次說明,我們只是簡單的使用了 prompt-toolkit 內建的一個叫做 WordCompleter 的補全特性,它能夠把用戶輸入和可能推薦的字典進行匹配,然后提供一個列表。
現在,我們有了一個能夠自動補全、fish shell 風格的歷史命令推薦以及上/下瀏覽歷史的 REPL 。實現這些特性只用了不到 10 行的實際代碼。
Click是一個命令行創建工具包,使用它能夠更容易的為程序解析命令行選項的參數和常量。在這兒我們不討論如何使用Click來作為參數解析器。相反,我們將會看看Click帶有的一些功能。
安裝Click:
pip install click
分頁器是 Unix 系統上的實用工具,它們能夠一次一頁地顯示很長的輸出。分頁器的一些例子包括less、more、most等。通過分頁器來顯示一個命令的輸出不僅僅是一個友好的設計,同時也是必要的。
讓我們進一步改進前面的例子。我們不再使用默認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 語句,并進行適當著色。
關于“Python怎么快速構建命令行用戶界面”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。