python Click库知识点汇总
Python Click庫
作用:用于快速創建命令行,或者說,通過裝飾器@click.command(把一個函數方法裝飾成命令行接口。
- 安裝:
- 如何使用:
基礎方法:裝飾器函數
- 使用@click.command() 裝飾一個函數,使之成為命令行接口
- 使用@click.option() 裝飾函數,為其添加命令行選項
- 使用@click.argument()裝飾函數,為其添加命令行選項
將上面的代碼保存為hello.py,在終端中運行:
python3 hello.py --help Usage: hello.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.- argument與option
argument() 裝飾器比 option() 功能簡單些,后者支持下面的特性:
自動提示缺失的輸入; option 參數可以從環境變量中獲取,argument 參數則不行; option 參數在 help 輸出中有完整的文檔,argument 則沒有;而 argument 參數可以接受可變個數的參數值,而 option 參數只能接收固定個數的參數值(默認是 1 個)。
命令行的參數名由 “-short_name” 或 “–long_name” 聲明,如果參數名既沒有以 “-“ 開頭,也沒有以 “–” 開頭
關于命令行參數,以前綴“-”開頭,和以前綴“–”(兩個連續短橫線)開頭,或者不帶任何前綴開頭的區別,參考原文:
Parameters
- Option
option 最基礎的用法就是簡單值變量,option 接收一個變量值,下面是一段示例代碼:
@click.command() @click.option('--n', default=1) def dots(n):click.echo('.' * n)如果在命令行后面跟隨參數 --n=2 就會輸出兩個點,如果傳參數,默認輸出一個點。上面的代碼中,參數類型沒有顯示給出,但解釋器會認為是 INT 型,因為默認值 1 是 int 值。
有些時候需要傳入多個值,可以理解為一個 list,option 只支持固定長度的參數值,即設置后必須傳入,個數由 nargs 確定。
既然可以傳入 list,那么 tuple 呢?Click 也是支持的:
@click.command() @click.option('--item', type=(unicode, int)) def putitem(item):click.echo('name=%s id=%d' % item)""" 這樣就傳入了一個 tuple 變量 putitem --item peter 1338 得到的輸出就是 name=peter id=1338 """上面沒有設置 nargs,因為 nargs 會自動取 tuple 的長度值。因此上面的代碼實際上等同于:
@click.command() @click.option('--item', nargs=2, type=click.Tuple([unicode, int])) def putitem(item):click.echo('name=%s id=%d' % item)option 還支持同一個參數多次使用,類似 git commit -m aa -m bb 中 -m 參數就傳入了 2 次。option 通過 multiple 標識位來支持這一特性:
@click.command() @click.option('--message', '-m', multiple=True) def commit(message):click.echo('\n'.join(message))有時候,命令行參數是固定的幾個值,這時就可以用到 Click.choice 類型來限定傳參的潛在值:
# choice @click.command() @click.option('--hash-type', type=click.Choice(['md5', 'sha1'])) def digest(hash_type):click.echo(hash_type)當上面的命令行程序參數 --hash-type 不是 md5 或 sha1,就會輸出錯誤提示,并且在 --help 提示中也會對 choice 選項有顯示。
如果希望命令行程序能在我們錯誤輸入或漏掉輸入的情況下,友好的提示用戶,就需要用到 Click 的 prompt 功能,看代碼:
# prompt @click.command() @click.option('--name', prompt=True) def hello(name):click.echo('Hello %s!' % name)如果在執行 hello 時沒有提供 –name 參數,控制臺會提示用戶輸入該參數。也可以自定義控制臺的提示輸出,把 prompt 改為自定義內容即可。
對于類似賬戶密碼等參數的輸入,就要進行隱藏顯示。option 的 hide_input 和 confirmation_promt 標識就是用來控制密碼參數的輸入:
# password @click.command() @click.option('--password', prompt=True, hide_input=True,confirmation_prompt=True) def encrypt(password):click.echo('Encrypting password to %s' % password.encode('rot13'))Click 把上面的操作進一步封裝成裝飾器 click.password_option(),因此上面的代碼也可以簡化成:
# password @click.command() @click.password_option() def encrypt(password):click.echo('Encrypting password to %s' % password.encode('rot13'))有的參數會改變命令行程序的執行,比如 node 是進入 Node 控制臺,而 node --verion 是輸出 node 的版本號。Click 提供 eager 標識對參數名進行標記,攔截既定的命令行執行流程,而是調用一個回調方法,執行后直接退出。下面模擬 click.version_option() 的功能,實現 --version 參數名輸出版本號:
# eager def print_version(ctx, param, value):if not value or ctx.resilient_parsing:returnclick.echo('Version 1.0')ctx.exit() @click.command() @click.option('--version', is_flag=True, callback=print_version,expose_value=False, is_eager=True) def hello():click.echo('Hello World!')對于類似刪除數據庫表這樣的危險操作,Click 支持彈出確認提示,–yes 標識位置為 True 時會讓用戶再次確認:
# yes parameters def abort_if_false(ctx, param, value):if not value:ctx.abort() @click.command() @click.option('--yes', is_flag=True, callback=abort_if_false,expose_value=False,prompt='Are you sure you want to drop the db?') def dropdb():click.echo('Dropped all tables!')測試運行下:
$ dropdb Are you sure you want to drop the db? [y/N]: n Aborted! $ dropdb --yes Dropped all tables!同樣的,Click 對次進行了封裝,click.confirmation_option() 裝飾器實現了上述功能:
@click.command() @click.confirmation_option(prompt='Are you sure you want to drop the db?') def dropdb():click.echo('Dropped all tables!') # range @click.command() @click.option('--count', type=click.IntRange(0, 20, clamp=True)) @click.option('--digit', type=click.IntRange(0, 10)) def repeat(count, digit):click.echo(str(digit) * count) if __name__ == '__main__':repeat()- 關于is_flag
Option的關鍵字參數中,有is_flag 參數,默認值是None,如果設置了該參數,即is_flag=True,則表示Option函數定義的參數為“標記”參數。
原文:
is_flag – forces this option to act as a flag. The default is auto detection.
例子:
import click @app.cli.command() # 注冊為命令 @click.option('--drop', is_flag=True, help='Create after drop.') # 設置選項 def initdb(drop): """Initialize the database.""" if drop: # 判斷是否輸入了選項 db.drop_all() db.create_all() click.echo('Initialized database.') # 輸出提示信息運行結果:
默認情況下,函數名稱就是命令的名字,現在執行 flask initdb 命令就可以創建數據庫表:
使用 --drop 選項可以刪除表后重新創建:
$ flask initdb --dropis_flag原文文檔請參考:is_flag
- Argument
Argument 的作用類似 Option,但沒有 Option 那么全面的功能。
和 Option 一樣,Argument 最基礎的應用就是傳遞一個簡單變量值:
@click.command() @click.argument('filename') def touch(filename):click.echo(filename)命令行后跟的參數值被賦值給參數名 filename。
另一個用的比較廣泛的是可變參數,也是由 nargs 來確定參數個數,變量值會以 tuple 的形式傳入函數:
@click.command() @click.argument('src', nargs=-1) @click.argument('dst', nargs=1) def copy(src, dst):for fn in src:click.echo('move %s to folder %s' % (fn, dst))運行程序:
$ copy foo.txt bar.txt my_folder move foo.txt to folder my_folder move bar.txt to folder my_folderClick 支持通過文件名參數對文件進行操作,click.File() 裝飾器就是處理這種操作的,尤其是在類 Unix 系統下,它支持以 - 符號作為標準輸入/輸出。
# File @click.command() @click.argument('input', type=click.File('rb')) @click.argument('output', type=click.File('wb')) def inout(input, output):while True:chunk = input.read(1024)if not chunk:break output.write(chunk)運行程序,先將文本寫進文件,再讀取
如果參數值只是想做為文件名而已呢,很簡單,將 type 指定為 click.Path():
@click.command() @click.argument('f', type=click.Path(exists=True)) def touch(f): click.echo(click.format_filename(f))- 打包跨平臺可執行程序
通過click編寫了簡單的命令行方法后,還需要把.py文件轉換成可以在控制臺里運行的命令行程序。最簡單的方法就是加上如下代碼:
if __name__ == '__main__':command()click支持使用setuptools來更好的實現命令行程序打包,把源碼文件打包成系統中的可執行程序,并且不限平臺。一般可通過在源碼根目錄下創建setup.py腳本,下面是一段簡單的打包代碼:
from setuptools import setup setup(name='hello',version='0.1',py_modules=['hello'],install_requires=['click',],entry_points='''[console_scripts]hello=hello:cli''', )留意entry_points字段,在console_scripts下,每一行都是一個控制臺腳本,等號左邊的是腳本的名稱,右邊的是click命令的導入路徑。
總結
以上是生活随笔為你收集整理的python Click库知识点汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL错误Got error -1
- 下一篇: python 入侵服务器_一个入侵iis