click 简单易用的Python命令行
在之前的一篇文章中,我們使用了 argparse 來獲取命令行參數。這個模塊雖然可以出色地完成命令行任務,但由于 argparse 是面向過程的,需要先設置解析器,再定義參數,再解析命令行,最后實現業務邏輯。看著就已經很復雜,對新手很不友好。
今天要介紹的 click 則是用一種簡單易讀的方式來實現命令行。
一、click介紹
click 是一個以盡可能少的代碼、以組合的方式創建優美的命令行程序的 Python 包。
它有如下三個特點:
任意嵌套命令?
自動生成幫助?
支持運行時延遲加載子命令
二、快速開始
2.1 業務邏輯
首先定義業務邏輯,在 argparse 中,業務邏輯是被放在最后一步,但 click 卻是放在第一步。
我們來看下官方示例中 click 的用法和哲學。假設命令行程序的輸入是 name 和 count,功能是打印指定次數的名字。
那么在 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)這段代碼的邏輯很簡單,就是循環 count 次,打印 name。
2.2 定義參數
然后,我們需要針對 count 和 name 來定義它們所對應的參數信息。
-
count 對應為命令行選項 --count,類型為數字,我們希望在不提供參數時,其默認值是 1
-
name 對應為命令行選項 --name,類型為字符串,我們希望在不提供參數時,能給人提示使用 click,就可以寫成下面這樣:
在上面的示例中:
使用@click.command() 裝飾一個函數,使之成為命令行接口
使用@click.option() 等裝飾函數,為其添加命令行選項
對于 --count 來說,使用 default 來指定默認值。而由于默認值是數字,進而暗示 --count 選項的類型為數字
對于 --name 來說,使用 prompt 來指定未輸入該選項時的提示語
不論是裝飾器的方式、還是各種默認行為,click 都是像它的介紹所說的那樣,讓人盡可能少地編寫代碼,讓整個過程變得快速而有趣。
2.3 代碼梳理
使用 click 的方式非常簡單,我們將上文的代碼匯總下,以有一個更清晰的認識:
# 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()若我們指定次數和名字:
$ python3 hello.py --count 2 --name Eric Hello Eric! Hello Eric!若我們什么都不指定,則會提示輸入名字,輸入后會默認輸出一次:
$ python3 hello.py Your name: Eric Hello Eric!我們還可以通過 --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.三、擴展
場景一:我們限定用戶輸入的值,那么就需要使用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中,查看命令歷史列表就能獲取密碼
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中,這個問題就能完美的解決,只需要是這prompt為True,那么我們就能交互式輸入密碼,設置hide_input為True,就能隱藏密碼,設置confirmation_prompt為True,就可以進行密碼的兩次驗證,使用起來非常便捷。
四、感慨
從上面的例子來看,click 用法優雅,令人迷醉,簡直是 Pythonic 。作者思路清奇,直接將 click 通過裝飾器定義參數。讓我明白了什么叫縱享絲滑。
?
參考資料:
[1]HelloGitHub-Team 倉庫:?https://github.com/HelloGitHub-Team/Article
[2]https://www.cnblogs.com/dachenzi/p/7995539.html
掃碼關注,獲取精選資源
總結
以上是生活随笔為你收集整理的click 简单易用的Python命令行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 通配符
- 下一篇: python 批量处理文本文档基础操作