click 简单易用的Python命令行
在之前的一篇文章中,我們使用了 argparse 來獲取命令行參數(shù)。這個(gè)模塊雖然可以出色地完成命令行任務(wù),但由于 argparse 是面向過程的,需要先設(shè)置解析器,再定義參數(shù),再解析命令行,最后實(shí)現(xiàn)業(yè)務(wù)邏輯。看著就已經(jīng)很復(fù)雜,對(duì)新手很不友好。
今天要介紹的 click 則是用一種簡(jiǎn)單易讀的方式來實(shí)現(xiàn)命令行。
一、click介紹
click 是一個(gè)以盡可能少的代碼、以組合的方式創(chuàng)建優(yōu)美的命令行程序的 Python 包。
它有如下三個(gè)特點(diǎn):
任意嵌套命令?
自動(dòng)生成幫助?
支持運(yùn)行時(shí)延遲加載子命令
二、快速開始
2.1 業(yè)務(wù)邏輯
首先定義業(yè)務(wù)邏輯,在 argparse 中,業(yè)務(wù)邏輯是被放在最后一步,但 click 卻是放在第一步。
我們來看下官方示例中 click 的用法和哲學(xué)。假設(shè)命令行程序的輸入是 name 和 count,功能是打印指定次數(shù)的名字。
那么在 hello.py 中,很容易寫出如下代碼:
def hello(count, name):"""Simple program that greets NAME for a total of COUNT times."""for x in range(count):print('Hello %s!' % name)這段代碼的邏輯很簡(jiǎn)單,就是循環(huán) count 次,打印 name。
2.2 定義參數(shù)
然后,我們需要針對(duì) count 和 name 來定義它們所對(duì)應(yīng)的參數(shù)信息。
-
count 對(duì)應(yīng)為命令行選項(xiàng) --count,類型為數(shù)字,我們希望在不提供參數(shù)時(shí),其默認(rèn)值是 1
-
name 對(duì)應(yīng)為命令行選項(xiàng) --name,類型為字符串,我們希望在不提供參數(shù)時(shí),能給人提示使用 click,就可以寫成下面這樣:
在上面的示例中:
使用@click.command() 裝飾一個(gè)函數(shù),使之成為命令行接口
使用@click.option() 等裝飾函數(shù),為其添加命令行選項(xiàng)
對(duì)于 --count 來說,使用 default 來指定默認(rèn)值。而由于默認(rèn)值是數(shù)字,進(jìn)而暗示 --count 選項(xiàng)的類型為數(shù)字
對(duì)于 --name 來說,使用 prompt 來指定未輸入該選項(xiàng)時(shí)的提示語
不論是裝飾器的方式、還是各種默認(rèn)行為,click 都是像它的介紹所說的那樣,讓人盡可能少地編寫代碼,讓整個(gè)過程變得快速而有趣。
2.3 代碼梳理
使用 click 的方式非常簡(jiǎn)單,我們將上文的代碼匯總下,以有一個(gè)更清晰的認(rèn)識(shí):
# hello.py 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."""for x in range(count):click.echo('Hello %s!' % name)if __name__ == '__main__':hello()若我們指定次數(shù)和名字:
$ python3 hello.py --count 2 --name Eric Hello Eric! Hello Eric!若我們什么都不指定,則會(huì)提示輸入名字,輸入后會(huì)默認(rèn)輸出一次:
$ python3 hello.py Your name: Eric Hello Eric!我們還可以通過 --help 參數(shù)查看自動(dòng)生成的幫助信息:
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.三、擴(kuò)展
場(chǎng)景一:我們限定用戶輸入的值,那么就需要使用Click模塊中的Choice函數(shù),Choice的參數(shù)是一個(gè)列表,該列表中列出所有可能的值。
import click@click.command() @click.option('-c',required=True,type=click.Choice(['start','stop'])) # 限定-c的值為start,或者stop,required表示是否為必填參數(shù) def getcommand(c):click.echo('command is %s' % c )if __name__ == '__main__':getcommand()場(chǎng)景二:應(yīng)用程序從命令行讀取密碼。
使用標(biāo)準(zhǔn)庫中的argparse模塊只能像輸入普通參數(shù)一樣輸入密碼。這種方式存在一定安全隱患,例如輸入的密碼會(huì)保存在history中,查看命令歷史列表就能獲取密碼
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()在Click中,這個(gè)問題就能完美的解決,只需要是這prompt為True,那么我們就能交互式輸入密碼,設(shè)置hide_input為True,就能隱藏密碼,設(shè)置confirmation_prompt為True,就可以進(jìn)行密碼的兩次驗(yàn)證,使用起來非常便捷。
四、感慨
從上面的例子來看,click 用法優(yōu)雅,令人迷醉,簡(jiǎn)直是 Pythonic 。作者思路清奇,直接將 click 通過裝飾器定義參數(shù)。讓我明白了什么叫縱享絲滑。
?
參考資料:
[1]HelloGitHub-Team 倉庫:?https://github.com/HelloGitHub-Team/Article
[2]https://www.cnblogs.com/dachenzi/p/7995539.html
掃碼關(guān)注,獲取精選資源
總結(jié)
以上是生活随笔為你收集整理的click 简单易用的Python命令行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通配符
- 下一篇: 关于计算机分类 按用途可以分为,计算机的