您好,登錄后才能下訂單哦!
Click 是用 Python 寫的一個第三方模塊,用于快速創建命令行。我們知道,Python 內置了一個 Argparse 的標準庫用于創建命令行,但使用起來有些繁瑣,Click 相比于 Argparse,就好比 requests 相比于 urllib。
關于Click?
說下 Click 模塊是干啥的,簡單說,它就是把我們的 Python 腳本的一些函數,通過添加帶有 Click 關鍵字的裝飾器進行裝飾進而將函數調用的形式轉化為命令行傳參的形式然后執行。聽不懂也沒關系,我們會一步一步來,基本上按照我的實際應用情況來寫的。
本文不會涉及太多復雜的語法和理論,將會用通俗的語言和大家進行分享。
安裝
python3 -m pip install click
一個簡單的例子
首先我們創建一個demo.py
import click #(1) @click.command() #(2) def main(): click.echo("hello click") #(3) if __name__ == '__main__': main()
裝飾器@click.command()會將我們的函數包裝成 click 對象,然后我們可以在函數中調用 click 的一些方法,常用的是click.echo,它的作用類似我們的 print,輸出用的。
通過命令行我們可以這樣運行這行代碼
python3 demo.py
好了,我們的第一個例子完事了,我們發現此時的代碼使用不使用 click好像沒什么區別。
接下來我們就要對它進行拓展了,如果我們需要傳入一個數字,然后打印這個時候,我們的代碼就可以這樣寫了。
傳入我們的第一個參數
import click @click.command() @click.option("-n", "--num", help="input a num") def main(num): click.echo(f"{num =}") if __name__ == '__main__': main()
這里我們前面代碼的基礎上給函數 main 增加了 @click.option
裝飾器。
接下來說下這幾個參數的含義
-n:表示我們在命令行指定參數名的時候使用它即可,注意是一個短'-'
--num:是第一個參數的完整名稱,我們在程序中接收值的時候使用它。注意是二個短'-'。
help:在命令行輸入 "python3 demo.py --help"
的時候,它可以提示我們這個程序有哪些命令可以用。和我們使用命令行一個道理的。
然后我們的函數main的參數名就是,我們要接收的參數的完整名稱,同時通過click.echo打印出來。,f"{num=}"
是 Python 3.8 以后的語法糖,如果 num=3 那么它等價于 num = 3。
最后記得在 __main__ 里執行我們的 main 方法。
好了,介紹完了代碼,我們可以運行了,運行示例:
首先假設我們不知道它有幾個參數。
python3 demo.py --help
通過help我們可以得到如下信息
Usage: demo.py [OPTIONS]
Options:
-n, --num TEXT input a num #這是定義該字段help的提示內容
--help Show this message and exit.
Usage: 對應我們當前文件名
Options: 是一行一個參數,一個參數分為-開頭的縮略參數,和--開頭的完整參數名。
然后我們后面可以看到它的類型是 TEXT。緊接著就是該參數的提示信息,通過 help 我們可以設置。
python3 demo.py -n 3 #輸出 num ='3' 或者 python3 demo.py --num 3 #輸出 num ='3'
上面兩者輸入方法是等價的使用哪個都行。
現在思考一個問題,如果我們需要 num 的值為數字類型的 3 怎么弄呢?
聲明參數類型
這里提供兩種方法(當然不僅兩種)
方法一:使用 type 關鍵字,type 就是 python 里的類型
@click.option("-n", "--num",type=int,help="input a num")
再次執行代碼
python3 demo.py -n 4 #輸出 num =4
同時查看 help 信息的時候 TEXT 變為了 INTEGER。
方法二:使用 default 關鍵字,指定默認值為 1
@click.option("-n", "--num",default=1,help="input a num")
將 default 的值設置為數字,我們的命令行就知道了我們的參數類型為 int,
這里處理指定了參數類型,還設定了默認值。設定為默認值的參數,可以不指定其值,這時候會使用默認值。
如果我們使用 help 查看信息會發現和上面的方法一沒什么區別的。這時候我們可以通過指定另外一個關鍵字,讓它在 help 信息里顯示默認值
@click.option("-n", "--num",default=1,help="input a num",show_default=True)
通過加入 show_default 我們可以讓 default 的值在 help 信息中顯示了,內容格式如下:
Usage: demo.py [OPTIONS]
Options:
-n, --num INTEGER input a num [default: 1]
--help Show this message and exit.
再加一個參數
在上面代碼的基礎上對代碼進行部分修改,主要是新添加一個參數 id。
import click @click.command() @click.option("-i", "--id", required=True, help="input an id") @click.option("-n", "--num", type=int, help="input a number", show_default=True) def main(id, num): click.echo(f"your {id=} {num=}") if __name__ == '__main__': main()
給之前的函數再添加 @click.option裝飾器即可。
這里我添加了的參數為 id ,因為一般情況下 id 是不能為空的,所以我們就可以通過required = True對它進行限制,表示該參數為必傳參數。如果不傳就出現錯誤
python3 demo.py -n 1234
#沒給id傳參,出現錯誤,提示缺少參數。
Usage: demo.py [OPTIONS]
Try "demo.py --help" for help.Error: Missing option "-i" / "--id".
正確的使用方法應該是
python3 demo.py -i 1 -n 1234
到目前為止一個簡答的命令行工具就生成了。接下來說下我用它做過什么事情。
處理實際問題
現在我們有個需求,根據用戶名去 mongo 數據庫中查找對應的用戶登錄信息,最終的生成信息格式如下:
不好意思人太多了,讓您久等了,您的信息來了!
**************************************************
用戶名:lisa
密碼: 1234qwer
登錄網站: http://www.xxxx.com
**************************************************️
目前密碼唯一的不要修改哦!
該條消息不用回復了,謝謝。
一開始我是通過在 python 腳本中加個配置文件,然后通過配置文件的形式進行用戶名的修改,但是這種方式不靈活,每次都需要重新運行 Python 代碼。或者我們還可以使用 fastapi搭建一個RESTful api的服務,但是我的懶得搭這個服務。最終我選擇使用命令行的形式去運行。使用的模塊就是今天說的這個 click 模塊。
接下來寫一段需要代碼:
@click.command() @click.option('-u', '--user_name', type=str, help='search user_name') def main(user_name): click.echo(f'search user:{user_name}') result = m.get_user_info(user_name) #數據庫查詢 try: info = f"不好意思人太多了,讓您久等了,您的信息來了!\n{'*' * 50}\n用戶名: {result.get('user_name')}\n" \ f"密碼: {result.get('user_pwd')}\n登錄網站: {result.get('url')}\n{'*' * 50}️\n目前密碼唯一的不要修改哦!\n該條消息不用回復了,謝謝。" except Exception as e: info = "Not Found" click.echo(info) if __name__ == '__main__': main()
通過上面的碼我們就可以通過命令行的形式進行查詢了。
python3 demo.py -u 1234
非常的方便。
如果這個時候,我需要一個臨時添加用戶的功能,就需要重新寫一個函數了,
然后我們在命令行中如何控制兩個函數的運行呢?這就是接下來要說的組。
創建組的形式
所謂的創建組,就是通過一個主入口函數,去關聯其他的函數,然后其他的函數名可以作為命令直接使用。
好了首先創建一個主入口函數
@click.group() def main(): pass
這個時候我們發現 main 上面的裝飾器變為了@click.group()。
我們通過它準備創建一個命令行組。接下來我們開始創建組成員,所謂的組成員就是一個函數。
@main.command() @click.option('-u', '--user_name', type=str, help='add user_name') def get_user(user_name): click.echo(f'search user:{user_name}')
這個組成員的作用和它的函數名是一樣的就是查詢用戶信息。
這里需要注意的是組成員的裝飾器由原來的
@click.command
變為了@main.command
。
main 就是上面 main 方法名。然后同樣下面的 option 是聲明一些參數。
接下來我們創建第二個組成員,用來添加用戶信息。
@main.command() @click.option('-u', '--user_name', required=True, type=str, help="要添加的用戶名") @click.option('-p', '--password', required=True, type=str, help="要添加的密碼") @click.option('-t', '--id_type', required=True, default="phone", type=str, help="添加的賬戶類型",show_default=True) def add_user(user_name, password, id_type): #do something..... click.echo(f"{user_name=} {password=} {id_type=}")
首先通過@main.command()
將它加入到組。然后就是 option 一系列添加參數的操作。這個具體的參數信息上面都說了這里就不提了。好了我們就創建這兩個成員,
如果需要其他的功能,比如說刪除用戶,可以繼續添加一個 delete_user 函數,以此類推。
下面我就說下如何執行上面的兩個成員函數。
首先,先看下它的 help 命令,都有什么內容,一般不知道一個命令行應用有什么命令參數的我時候我們可以使用它。
python3 demo.py --help
輸出以下內容
Usage: demo.py [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.Commands:
add-user
get-user
其中 Commands 就是我們的成員函數的調用命令,需要注意一下它將函數原來的"_"變為了“-”。
然后我們就可以調用查詢方法了
python3 demo.py get-user -u 123
然后我們就可以得到結果
search user:123
同樣的調用添加用戶信息的方法。
python3 demo.py add-user -u 123 -p "1234qwer"
因為-t不是必傳參數所以我們可以忽略,使用默認值"phone"。
好了,這就是今天要說的內容,基本上夠日常操作了。
更多內容,感興趣的朋友可以參考官方文檔。
到此這篇關于深入淺析Python 命令行模塊 Click的文章就介紹到這了,更多相關Python 命令行模塊 Click內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。