當前位置:
首頁 > 知識 > 命令行開發神器 Click 簡明指南

命令行開發神器 Click 簡明指南

點擊上方

Python開發

」,選擇「置頂公眾號」


關鍵時刻,第一時間送達!



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


快速使用

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


使用 @click.command() 裝飾一個函數,使之成為命令行介面; 使用 @click.option() 等裝飾函數,為其添加命令行選項等。 它的一種典型使用形式如下:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--param"

    ,

    default

    =

    default_value

    ,

    help

    =

    "description"

    )

  4. def

    func

    (

    param

    ):

  5.    

    pass


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

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--count"

    ,

    default

    =

    1

    ,

    help

    =

    "Number of greetings."

    )

  4. @click

    .

    option

    (

    "--name"

    ,

    prompt

    =

    "Your name"

    ,

    help

    =

    "The person to greet."

    )

  5. def

    hello

    (

    count

    ,

    name

    ):

  6.    

    """Simple program that greets NAME for a total of COUNT times."""

  7.    

    for

    x

    in

    range

    (

    count

    ):

  8.        click

    .

    echo

    (

    "Hello %s!"

    %

    name

    )

  9. if

    __name__

    ==

    "__main__"

    :

  10.    hello

    ()


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




  • @click.command() 使函數 hello 成為命令行介面;



  • @click.option 的第一個參數指定了命令行選項的名稱,可以看到,count 的默認值是 1;



  • 使用 click.echo 進行輸出是為了獲得更好的兼容性,因為 print 在 Python2 和 Python3 的用法有些差別。


看看執行情況:

  1. $ python hello

    .

    py

  2. Your

    name

    :

    Ethan

             

    # 這裡會顯示 "Your name: "(對應代碼中的 prompt),接受用戶輸入

  3. Hello

    Ethan

    !

  4. $ python hello

    .

    py

    --

    help  

    # click 幫我們自動生成了 `--help` 用法

  5. Usage

    :

    hello

    .

    py

    [

    OPTIONS

    ]

  6.  

    Simple

    program that greets NAME

    for

    a total of COUNT times

    .

  7. Options

    :

  8.  

    --

    count INTEGER  

    Number

    of greetings

    .

  9.  

    --

    name TEXT      

    The

    person to greet

    .

  10.  

    --

    help          

    Show

    this

    message

    and

    exit

    .

  11. $ python hello

    .

    py

    --

    count

    3

    --

    name

    Ethan

       

    # 指定 count 和 name 的值

  12. Hello

    Ethan

    !

  13. Hello

    Ethan

    !

  14. Hello

    Ethan

    !

  15. $ python hello

    .

    py

    --

    count

    =

    3

    --

    name

    =

    Ethan

       

    # 也可以使用 `=`,和上面等價

  16. Hello

    Ethan

    !

  17. Hello

    Ethan

    !

  18. Hello

    Ethan

    !

  19. $ python hello

    .

    py

    --

    name

    =

    Ethan

                 

    # 沒有指定 count,默認值是 1

  20. Hello

    Ethan

    !


click.option


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




  • default: 設置命令行參數的默認值



  • help: 參數說明



  • type: 參數類型,可以是 string, int, float 等



  • prompt: 當在命令行中沒有輸入相應的參數時,會根據 prompt 提示用戶輸入



  • nargs: 指定命令行參數接收的值的個數


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


指定 type


我們可以使用 type 來指定參數類型:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--rate"

    ,

    type

    =

    float

    ,

    help

    =

    "rate"

    )

     

    # 指定 rate 是 float 類型

  4. def

    show

    (

    rate

    ):

  5.    click

    .

    echo

    (

    "rate: %s"

    %

    rate

    )

  6. if

    __name__

    ==

    "__main__"

    :

  7.    show

    ()


執行情況:

  1. $ python click_type

    .

    py

    --

    rate

    1

  2. rate

    :

    1.0

  3. $ python click_type

    .

    py

    --

    rate

    0.66

  4. rate

    :

    0.66


可選值


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

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--gender"

    ,

    type

    =

    click

    .

    Choice

    ([

    "man"

    ,

    "woman"

    ]))

       

    # 限定值

  4. def

    choose

    (

    gender

    ):

  5.    click

    .

    echo

    (

    "gender: %s"

    %

    gender

    )

  6. if

    __name__

    ==

    "__main__"

    :

  7.    choose

    ()


執行情況:

  1. $ python click_choice

    .

    py

    --

    gender boy

  2. Usage

    :

    click_choice

    .

    py

    [

    OPTIONS

    ]

  3. Error

    :

    Invalid

    value

    for

    "--gender"

    :

    invalid choice

    :

    boy

    .

    (

    choose

    from

    man

    ,

    woman

    )

  4. $ python click_choice

    .

    py

    --

    gender man

  5. gender

    :

    man


多值參數


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


看看例子就明白了:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--center"

    ,

    nargs

    =

    2

    ,

    type

    =

    float

    ,

    help

    =

    "center of the circle"

    )

  4. @click

    .

    option

    (

    "--radius"

    ,

    type

    =

    float

    ,

    help

    =

    "radius of the circle"

    )

  5. def

    circle

    (

    center

    ,

    radius

    ):

  6.    click

    .

    echo

    (

    "center: %s, radius: %s"

    %

    (

    center

    ,

    radius

    ))

  7. if

    __name__

    ==

    "__main__"

    :

  8.    circle

    ()


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


執行情況:

  1. $ python click_multi_values

    .

    py

    --

    center

    3

    4

    --

    radius

    10

  2. center

    :

    (

    3.0

    ,

    4.0

    ),

    radius

    :

    10.0

  3. $ python click_multi_values

    .

    py

    --

    center

    3

    4

    5

    --

    radius

    10

  4. Usage

    :

    click_multi_values

    .

    py

    [

    OPTIONS

    ]

  5. Error

    :

    Got

    unexpected extra argument

    (

    5

    )


輸入密碼


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


看看例子:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--password"

    ,

    prompt

    =

    True

    ,

    hide_input

    =

    True

    ,

    confirmation_prompt

    =

    True

    )

  4. def

    input_password

    (

    password

    ):

  5.    click

    .

    echo

    (

    "password: %s"

    %

    password

    )

  6. if

    __name__

    ==

    "__main__"

    :

  7.    input_password

    ()


執行情況:

  1. $ python click_password

    .

    py

  2. Password

    :

                           

    # 不會顯示密碼

  3. Repeat

    for

    confirmation

    :

             

    # 重複一遍

  4. password

    :

    666666


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

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    password_option

    ()

  4. def

    input_password

    (

    password

    ):

  5.    click

    .

    echo

    (

    "password: %s"

    %

    password

    )

  6. if

    __name__

    ==

    "__main__"

    :

  7.    input_password

    ()


改變命令行程序的執行


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


讓我們看看例子:

  1. import

    click

  2. def

    print_version

    (

    ctx

    ,

    param

    ,

    value

    ):

  3.    

    if

    not

    value

    or

    ctx

    .

    resilient_parsing

    :

  4.        

    return

  5.    click

    .

    echo

    (

    "Version 1.0"

    )

  6.    ctx

    .

    exit

    ()

  7. @click

    .

    command

    ()

  8. @click

    .

    option

    (

    "--version"

    ,

    is_flag

    =

    True

    ,

    callback

    =

    print_version

    ,

  9.              expose_value

    =

    False

    ,

    is_eager

    =

    True

    )

  10. @click

    .

    option

    (

    "--name"

    ,

    default

    =

    "Ethan"

    ,

    help

    =

    "name"

    )

  11. def

    hello

    (

    name

    ):

  12.    click

    .

    echo

    (

    "Hello %s!"

    %

    name

    )

  13. if

    __name__

    ==

    "__main__"

    :

  14.    hello

    ()


其中:




  • is_eager=True 表明該命令行選項優先順序高於其他選項;



  • expose_value=False 表示如果沒有輸入該命令行選項,會執行既定的命令行流程;



  • callback 指定了輸入該命令行選項時,要跳轉執行的函數;


執行情況:

  1. $ python click_eager

    .

    py

  2. Hello

    Ethan

    !

  3. $ python click_eager

    .

    py

    --

    version                  

    # 攔截既定的命令行執行流程

  4. Version

    1.0

  5. $ python click_eager

    .

    py

    --

    name

    Michael

  6. Hello

    Michael

    !

  7. $ python click_eager

    .

    py

    --

    version

    --

    name

    Ethan

         

    # 忽略 name 選項

  8. Version

    1.0


click.argument


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


入門使用


下面是一個簡單的例子:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    argument

    (

    "coordinates"

    )

  4. def

    show

    (

    coordinates

    ):

  5.    click

    .

    echo

    (

    "coordinates: %s"

    %

    coordinates

    )

  6. if

    __name__

    ==

    "__main__"

    :

  7.    show

    ()


看看執行情況:

  1. $ python click_argument

    .

    py                    

    # 錯誤,缺少參數 coordinates

  2. Usage

    :

    click_argument

    .

    py

    [

    OPTIONS

    ]

    COORDINATES

  3. Error

    :

    Missing

    argument

    "coordinates"

    .

  4. $ python click_argument

    .

    py

    --

    help              

    # argument 指定的參數在 help 中沒有顯示

  5. Usage

    :

    click_argument

    .

    py

    [

    OPTIONS

    ]

    COORDINATES

  6. Options

    :

  7.  

    --

    help  

    Show

    this

    message

    and

    exit

    .

  8. $ python click_argument

    .

    py

    --

    coordinates

    10

       

    # 錯誤用法,這是 option 參數的用法

  9. Error

    :

    no

    such option

    :

    --

    coordinates

  10. $ python click_argument

    .

    py

    10

                     

    # 正確,直接輸入值即可

  11. coordinates

    :

    10


多個 argument


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

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    argument

    (

    "x"

    )

  4. @click

    .

    argument

    (

    "y"

    )

  5. @click

    .

    argument

    (

    "z"

    )

  6. def

    show

    (

    x

    ,

    y

    ,

    z

    ):

  7.    click

    .

    echo

    (

    "x: %s, y: %s, z:%s"

    %

    (

    x

    ,

    y

    ,

    z

    ))

  8. if

    __name__

    ==

    "__main__"

    :

  9.    show

    ()


執行情況:

  1. $ python click_argument

    .

    py

    10

    20

    30

  2. x

    :

    10

    ,

    y

    :

    20

    ,

    z

    :

    30

  3. $ python click_argument

    .

    py

    10

  4. Usage

    :

    click_argument

    .

    py

    [

    OPTIONS

    ]

    X Y Z

  5. Error

    :

    Missing

    argument

    "y"

    .

  6. $ python click_argument

    .

    py

    10

    20

  7. Usage

    :

    click_argument

    .

    py

    [

    OPTIONS

    ]

    X Y Z

  8. Error

    :

    Missing

    argument

    "z"

    .

  9. $ python click_argument

    .

    py

    10

    20

    30

    40

  10. Usage

    :

    click_argument

    .

    py

    [

    OPTIONS

    ]

    X Y Z

  11. Error

    :

    Got

    unexpected extra argument

    (

    40

    )


不定參數


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

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    argument

    (

    "src"

    ,

    nargs

    =-

    1

    )

  4. @click

    .

    argument

    (

    "dst"

    ,

    nargs

    =

    1

    )

  5. def

    move

    (

    src

    ,

    dst

    ):

  6.    click

    .

    echo

    (

    "move %s to %s"

    %

    (

    src

    ,

    dst

    ))

  7. if

    __name__

    ==

    "__main__"

    :

  8.    move

    ()


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


讓我們看看執行情況:

  1. $ python click_argument

    .

    py file1 trash    

    # src=("file1",)  dst="trash"

  2. move

    (

    u

    "file1"

    ,)

    to trash

  3. $ python click_argument

    .

    py file1 file2 file3 trash  

    # src=("file1", "file2", "file3")  dst="trash"

  4. move

    (

    u

    "file1"

    ,

    u

    "file2"

    ,

    u

    "file3"

    )

    to trash


彩色輸出


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

  1. $ pip install colorama


看看例子:

  1. import

    click

  2. @click

    .

    command

    ()

  3. @click

    .

    option

    (

    "--name"

    ,

    help

    =

    "The person to greet."

    )

  4. def

    hello

    (

    name

    ):

  5.    click

    .

    secho

    (

    "Hello %s!"

    %

    name

    ,

    fg

    =

    "red"

    ,

    underline

    =

    True

    )

  6.    click

    .

    secho

    (

    "Hello %s!"

    %

    name

    ,

    fg

    =

    "yellow"

    ,

    bg

    =

    "black"

    )

  7. if

    __name__

    ==

    "__main__"

    :

  8.    hello

    ()


其中:




  • fg 表示前景顏色(即字體顏色),可選值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;



  • bg 表示背景顏色,可選值有:BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE 等;



  • underline 表示下劃線,可選的樣式還有:dim=True,bold=True 等;


小結


使用 click.command() 裝飾一個函數,使其成為命令行介面。 使用 click.option() 添加可選參數,支持設置固定長度的參數值。 使用 click.argument() 添加固定參數,支持設置不定長度的參數值。





  • 作者:funhacks



  • 原文:https://funhacks.net/2016/12/20/click/



  • Python開發整理髮布,轉載請聯繫作者獲得授權


【點擊成為Java大神】

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發 的精彩文章:

500 行 Python 代碼構建一個輕量級爬蟲框架
實用又好用,6 款 Python 特殊文本格式處理庫推薦

TAG:Python開發 |