命令列神器 Click 簡明筆記

發表於2016-12-23

Click 是用 Python 寫的一個第三方模組,用於快速建立命令列。我們知道,Python 內建了一個 Argparse 的標準庫用於建立命令列,但使用起來有些繁瑣,Click 相比於 Argparse,就好比 requests 相比於 urllib

快速使用

Click 的使用大致有兩個步驟:

  1. 使用 @click.command() 裝飾一個函式,使之成為命令列介面;
  2. 使用 @click.option() 等裝飾函式,為其新增命令列選項等。

它的一種典型使用形式如下:

下面,讓我們看一下官方文件的入門例子:

在上面的例子中,函式 hello 有兩個引數:count 和 name,它們的值從命令列中獲取。

  • @click.command() 使函式 hello 成為命令列介面;
  • @click.option 的第一個引數指定了命令列選項的名稱,可以看到,count 的預設值是 1;
  • 使用 click.echo 進行輸出是為了獲得更好的相容性,因為 print 在 Python2 和 Python3 的用法有些差別。

看看執行情況:

click.option

option 最基本的用法就是通過指定命令列選項的名稱,從命令列讀取引數值,再將其傳遞給函式。在上面的例子,我們看到,除了設定命令列選項的名稱,我們還會指定預設值,help 說明等,option 常用的設定引數如下:

  • default: 設定命令列引數的預設值
  • help: 引數說明
  • type: 引數型別,可以是 string, int, float 等
  • prompt: 當在命令列中沒有輸入相應的引數時,會根據 prompt 提示使用者輸入
  • nargs: 指定命令列引數接收的值的個數

下面,我們再看看相關的例子。

指定 type

我們可以使用 type 來指定引數型別:

執行情況:

可選值

在某些情況下,一個引數的值只能是某些可選的值,如果使用者輸入了其他值,我們應該提示使用者輸入正確的值。在這種情況下,我們可以通過 click.Choice() 來限定:

執行情況:

多值引數

有時,一個引數需要接收多個值。option 支援設定固定長度的引數值,通過 nargs 指定。

看看例子就明白了:

在上面的例子中,option 指定了兩個引數:center 和 radius,其中,center 表示二維平面上一個圓的圓心座標,接收兩個值,以元組的形式將值傳遞給函式,而 radius 表示圓的半徑。

執行情況:

輸入密碼

有時,在輸入密碼的時候,我們希望能隱藏顯示。option 提供了兩個引數來設定密碼的輸入:hide_input 和 confirmation_promt,其中,hide_input 用於隱藏輸入,confirmation_promt 用於重複輸入。

看看例子:

執行情況:

由於上面的寫法有點繁瑣,click 也提供了一種快捷的方式,通過使用 @click.password_option(),上面的程式碼可以簡寫成:

改變命令列程式的執行

有些引數會改變命令列程式的執行,比如在終端輸入 python 是進入 python 控制檯,而輸入 python --version 是列印 python 版本。Click 提供 eager 標識對引數名進行標識,如果輸入該引數,則會攔截既定的命令列執行流程,跳轉去執行一個回撥函式。

讓我們看看例子:

其中:

  • is_eager=True 表明該命令列選項優先順序高於其他選項;
  • expose_value=False 表示如果沒有輸入該命令列選項,會執行既定的命令列流程;
  • callback 指定了輸入該命令列選項時,要跳轉執行的函式;

執行情況:

click.argument

我們除了使用 @click.option 來新增可選引數,還會經常使用 @click.argument 來新增固定引數。它的使用和 option 類似,但支援的功能比 option 少。

入門使用

下面是一個簡單的例子:

看看執行情況:

多個 argument

我們再來看看多個 argument 的例子:

執行情況:

不定引數

argument 還有另外一種常見的用法,就是接收不定量的引數,讓我們看看例子:

其中,nargs=-1 表明引數 src 接收不定量的引數值,引數值會以 tuple 的形式傳入函式。如果 nargs 大於等於 1,表示接收 nargs 個引數值,上面的例子中,dst 接收一個引數值。

讓我們看看執行情況:

彩色輸出

在前面的例子中,我們使用 click.echo 進行輸出,如果配合 colorama 這個模組,我們可以使用 click.secho 進行彩色輸出,在使用之前,使用 pip 安裝 colorama:

看看例子:

其中:

  • fg 表示前景顏色(即字型顏色),可選值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • bg 表示背景顏色,可選值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;
  • underline 表示下劃線,可選的樣式還有:dim=Truebold=True 等;

小結

  • 使用 click.command() 裝飾一個函式,使其成為命令列介面。
  • 使用 click.option() 新增可選引數,支援設定固定長度的引數值。
  • 使用 click.argument() 新增固定引數,支援設定不定長度的引數值。

參考資料

相關文章