1. 程式人生 > >Python3學習(三十七):python中的click模組詳解

Python3學習(三十七):python中的click模組詳解

Click模組

click模組是Flask的作者開發的一個第三方模組,用於快速建立命令列。它的作用與Python標準庫的argparse相同,但是,使用起來更簡單。

基本使用

Click對argparse的主要改在在於易用性,使用click模組主要分為兩個步驟:

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

下列為click官方提供的例子:

import click

 

@click.command()

@click.option('--count', default=1, help='Number of greetings.')

@click.option('--name', prompt='Your name',

              help='The person to greet.')

def hello(count, name):

    """Simple program that greets NAME for a total of COUNT times."""  # 會當作help資訊進行輸出

    for x in range(count):

        click.echo('Hello %s!' % name)

 

if __name__ == '__main__':

    hello()

command:使函式hello成為命令列介面在上面的例子中,函式hello接受兩個引數,分別是count和name,他們的取值從命令列中獲取,這裡我們使用了click模組中的command、option、echo,他們的作用如下:

  • option:增加命令列選項
  • echo:輸出結果,使用echo進行輸出是為了更好的相容性,因為python 2中的print是個語句,python 3中的print 是一個函式

執行上面的指令碼,可以通過命令指定--name,--count的值,由於我們在option中指定了prompt選項,那麼如果我們執行指令碼沒有傳遞name這個引數時,Click會提示我們在互動模式下輸入

PS:與argparse模組一樣,click也會為我們自動生成提示資訊

lidaxindeMacBook-Pro:hello DahlHin$ python3 click模組.py --help

Usage: click模組.py [OPTIONS]



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



Options:

  --count INTEGER  Number of greetings.

  --name TEXT      The person to greet.

  --help           Show this message and exit.

option最基本的用法就是通過指定命令列選項的名稱,從命令列讀取引數值,再將其傳遞給函式。option常用的引數含義:

其他引數

  • default: 設定命令列引數的預設值
  • help:引數說明
  • type:引數型別,可以是string、int、float等
  • prompt:當在命令列中沒有輸入相應的引數時,會更具prompt提示使用者輸入
  • nargs:指定命令列引數接受的值的個數
  • required:是否為必填引數
import click



@click.command()

@click.option('--pos',nargs=2,type=float)



def getfloat(pos):

    click.echo('%s / %s' % pos )



if __name__ == '__main__':

更多引數請參考: http://click.pocoo.org/5/options/#choice-opts 注意:option中定義的引數名稱,那麼就需要用同名的變數進行接受。

擴充套件用法

場景一:我們限定使用者輸入的值,那麼就需要使用Click模組中的Choice函式,Choice的引數是一個列表,該列表中列出所有可能的值。

import click



@click.command()

@click.option('-c',required=True,type=click.Choice(['start','stop']))   # 限定-c的值為start,或者stop,required表示是否為必填引數

def getcommand(c):

    click.echo('command is %s' % c )



if __name__ == '__main__':

    getcommand()

使用標準庫中的argparse模組只能像輸入普通引數一樣輸入密碼。這種方式存在一定安全隱患,例如輸入的密碼會儲存在history中,檢視命令歷史列表就能獲取密碼場景二:應用程式從命令列讀取密碼。 

在Click中,這個問題就能完美的解決,只需要是這prompt為True,那麼我們就能互動式輸入密碼,設定hide_input為True,就能隱藏密碼,設定confirmation_prompt為True,就可以進行密碼的兩次驗證,使用起來非常便捷。

import click



@click.command()

@click.option('-p',prompt='Your Password',hide_input=True,confirmation_prompt=True)



def getpassword(p):

    click.echo('Your Password is : %s' % p)



if __name__ == '__main__':

    getpassword()

場景三:不同的 Command 例項可以關聯到 group 中。group 下繫結的命令就成為了它的子命令,參考下面的程式碼:

@click.group()
def cli():
    pass
@click.command()
def initdb():
    click.echo('Initialized the database')
@click.command()
def dropdb():
    click.echo('Dropped the database')
cli.add_command(initdb)
cli.add_command(dropdb)