Python 命令行(五)- click 庫

一. 認識 Click 庫

連載關(guān)于命令行系列文章牍白,我們提到了 Python 標(biāo)準(zhǔn)庫模塊 argparse 可用于解析命令行參數(shù)~ 但由于 argparse 使用復(fù)雜立肘,add_argument 方法參數(shù)眾多。為此澜搅,第三方庫模塊 click 應(yīng)運而生雕蔽,極大地改善了 argparse 的易用性声离。

注:Click 第三方庫由 Flask 的作者 Armin Ronacher 開發(fā)。Click 相較于 argparse 較好比 requests 相較于 urllib锉走。

使用 click 之前滨彻,需要先進行安裝:

pip install click

Click 模塊構(gòu)建 Python 命令行,分以下 2 步走:

  • 使用 @click.command() 裝飾器挪蹭,使被裝飾的函數(shù)成為命令行接口亭饵;
  • 使用 @click.option() 等裝飾器,添加命令行選項梁厉。

下面是一個簡單的示例:

import click

@click.command()
@click.option('--count', default=1, help='Number of grettings.')
@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."""
    for x in range(count):
        click.echo('Hello %s' % name)
        
if __name__ == '__main__':
    hello()

函數(shù) hello 接受兩個參數(shù) countname 辜羊,分別從命令行中讀取值。程序中用到了 click 模塊的 command option 以及 echo ,它們的作用如下:

  • command 使得函數(shù) hello 作為命令行接口八秃;
  • option 添加命令行選項碱妆;
  • click.echo 主要是從兼容性考慮:Python2 的 print 是語句,而 Python3 中則為函數(shù)昔驱。

運行結(jié)果:

由于我們剛剛在添加 name 參數(shù)時疹尾,指定了 prompt='Your name' ,因此當(dāng)執(zhí)行命令行時骤肛,如果沒有指定 --name 航棱,Click 將提示用戶在交互模式下輸入。--count 參數(shù)在定義時萌衬,我們指定了默認值 default=1 饮醇。

此外,和 argparse 一樣秕豫,click 也會自動為我們生成好幫助信息:

二. 添加參數(shù)的詳細用法

Click 庫提供的裝飾器 @click.option 通過指定命令行選項的名稱朴艰,從命令行讀取參數(shù)值,再將其傳遞給函數(shù)混移。其中祠墅,option 常用的設(shè)置參數(shù)如下:

  • default 設(shè)置命令行參數(shù)的默認值;
  • help 參數(shù)說明歌径;
  • type 指定參數(shù)類型毁嗦,如 string int float
  • prompt 當(dāng)命令行未指定相應(yīng)參數(shù)時回铛,會根據(jù) prompt 提示用戶輸入狗准;
  • nargs 指定命令行參數(shù)接受的值的個數(shù)。

示例 1 標(biāo)準(zhǔn)庫的 argparse 可以通過 nargs 配置參數(shù)的個數(shù)茵肃,通過 type 設(shè)置參數(shù)的數(shù)據(jù)類型腔长。在 click 中也可以實現(xiàn):

import click

@click.command()
@click.option('--pos', nargs=2, type=float)
def example(pos):
    click.echo('pos={}'.format(pos))

if __name__ == '__main__':
    example()

運行結(jié)果:

上述的例子中,程序會自動將參數(shù)轉(zhuǎn)換為浮點數(shù)验残,并且以元組的形式賦值給變量 pos 捞附。

示例 2 對于枚舉類型的命令行參數(shù),可以指定 typeclick.Choice 實例您没。Choice 的參數(shù)是一個列表鸟召,改列表列出所有可能的值。

import click

@click.command()
@click.option('--subject', type=click.Choice(['math','chinese','english']))
def score(subject):
    click.echo('{} score: 100'.format(subject))

if __name__ == '__main__':
    score()

運行結(jié)果:

示例 3 交互式地輸入密碼

argparse 模塊中氨鹏,輸入密碼只能像普通參數(shù)一樣設(shè)置欧募,這將帶來一定的安全隱患:使用 history 就可以輕易獲取到我們的密碼。

click 中喻犁,上述問題得到了非常優(yōu)美的解決:只需要設(shè)置 prompt=True 槽片,就能夠交互式地輸入密碼何缓;設(shè)置 hide_input=True 即可隱藏我們的命令行輸入;設(shè)置 confirmation_prompt=True 就可以進行密碼的兩次驗證还栓。

import click
from werkzeug.security import generate_password_hash

@click.command()
@click.option('--password', prompt=True, hide_input=True, confirmation_prompt=True)
def encrypt(password):
    click.echo('Encrypting password to %s' % generate_password_hash(password))

if __name__ == '__main__':
    encrypt()

運行結(jié)果:

示例 5 在編輯器中編輯輸入的數(shù)據(jù)

熟悉 Linux 系統(tǒng)的用戶碌廓,很可能使用過命令 fc,在編輯長命令時非常便捷剩盒。輸入 fc 命令并回車會打開一個編輯器谷婆,改編輯器已經(jīng)保存了上一條命令的內(nèi)容。我們只需要在編輯器中修復(fù)錯誤內(nèi)容辽聊,然后保存并退出纪挎,剛才編輯的命令將會自動執(zhí)行。

使用 Click 庫跟匆,在 Python 中也能實現(xiàn)類似的功能:

from __future__ import print_function
import click
import os

message = click.edit()
print(message)
print(os.system(message))

運行代碼异袄,程序?qū)⒆詣舆M入默認編輯器。進入編輯器之后玛臂,就可以在編輯器中編輯輸入的數(shù)據(jù)烤蜕,輸入的內(nèi)容將被賦值給程序中的變量 message

注:Click 是一個非常優(yōu)秀的開源項目,更多詳細用法迹冤,可以參見 Click 官網(wǎng):https://click.palletsprojects.com/en/8.0.x/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讽营,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泡徙,更是在濱河造成了極大的恐慌橱鹏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪藐,死亡現(xiàn)場離奇詭異莉兰,居然都是意外死亡,警方通過查閱死者的電腦和手機庶橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門贮勃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苏章,你說我怎么就攤上這事∽嗨玻” “怎么了枫绅?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硼端。 經(jīng)常有香客問我并淋,道長,這世上最難降的妖魔是什么珍昨? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任县耽,我火速辦了婚禮句喷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兔毙。我一直安慰自己唾琼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布澎剥。 她就那樣靜靜地躺著锡溯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哑姚。 梳的紋絲不亂的頭發(fā)上祭饭,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音叙量,去河邊找鬼倡蝙。 笑死,一個胖子當(dāng)著我的面吹牛绞佩,可吹牛的內(nèi)容都是我干的寺鸥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼征炼,長吁一口氣:“原來是場噩夢啊……” “哼析既!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谆奥,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤眼坏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酸些,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宰译,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年魄懂,在試婚紗的時候發(fā)現(xiàn)自己被綠了沿侈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡市栗,死狀恐怖缀拭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情填帽,我是刑警寧澤蛛淋,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站篡腌,受9級特大地震影響褐荷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘹悼,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一叛甫、第九天 我趴在偏房一處隱蔽的房頂上張望层宫。 院中可真熱鬧,春花似錦其监、人聲如沸萌腿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮奇。三九已至,卻和暖如春睛约,著一層夾襖步出監(jiān)牢的瞬間鼎俘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工辩涝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贸伐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓怔揩,卻偏偏與公主長得像捉邢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子商膊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容