Python 命令列引數解析之 Click
在Python筆記:命令列引數解析中介紹了sys.argv、getopt 和 argparse三種命令列引數解析方法,今天來分享另外一個python命令列工具click,它是用來支援 Web開發框架 Flask的,都由Pallets 專案組織開發。
目錄click簡介
click相比於其他命令列工具的一個優勢就是支援多個命令的巢狀和組合,主要包含以下特性:(摘自:為什麼用 Click?)
- 沒有限制可以簡單組合
- 完全遵循 Unix 命令列約定
- 支援從環境變數中載入值
- 支援特定值的提示
- 充分地可巢狀可組合
- 相容python 2 和 3
- 支援外部檔案處理
- 與一些常用的工具幫手結合 (獲得 terminal 大小, ANSI 字元顏色, 直接輸入按鍵, 螢幕清理, 獲取 config 路徑, 啟動 apps 和 editors, 等。)
選項設定
下面使用click來實現文章Python筆記:命令列引數解析中的命令列,可以對比一下它們的差異。
import click @click.command() @click.option('--field', '-f', help='欄位', multiple=True) # @click.option('--display-filter', '-Y', prompt='display-filter', nargs=2, help='條件') @click.option('--display-filter', '-Y', prompt='display-filter', type=(str, int, float, bool), help='條件') @click.option('--count', '-c', default=2, prompt='count', help='條件') def cli(field, display_filter,count): """Simple program that greets NAME for a total of COUNT times.""" click.echo(f'{field} {display_filter} {count}') if __name__ == '__main__': cli()
可以看到,click使用裝飾器@click.command()將cli()方法包裝成 click 物件,然後使用@click.option來新增選項引數,下面來介紹這些引數的含義。
基本選項
預設第一個引數為長選項,help
引數用於設定選項的描述資訊:
$ python3 test_click.py --help Usage: test_click.py [OPTIONS] Simple program that greets NAME for a total of COUNT times. Options: -f, --field TEXT 欄位 -Y, --display-filter <TEXT INTEGER FLOAT BOOLEAN>... 條件 -c, --count 計數 --help Show this message and exit.
也可以使用help_option方法修改help選項顯示資訊:
@click.help_option('--help', '-h', help='幫助資訊')
-
default
引數:設定選項預設值 -
type
:設定引數型別 -
prompt
:設定提示資訊,設定prompt=true
或者prompt=提示資訊
後,如果沒有設定引數,會出現提示,預設關閉。
多個選項和選項多個值
1、選項可以設定多個值,可以通過兩種方式:
-
通過
nargs
引數來配置。多個值將被放入一個元組(tuple)中,只支援固定數量的引數。 -
使用
type
引數設定不同型別的值:type=(str, int, float, bool)
2、multiple=True
允許多個選項賦值:
一個引數傳遞多次,並且記錄每次的值
$ python3 test_click.py -f tcp -f udp -Y ip.version==4 -c 1
('tcp', 'udp') ip.version==4 1
密碼提示
Click 支援隱藏輸入資訊和確認,比如輸入密碼時隱藏內容,也可以直接用 password_option()
裝飾器:
import click
@click.command()
@click.option('--password', '-p', prompt=True, hide_input=True, confirmation_prompt=True)
# @click.password_option('--password', '-p', prompt=True, hide_input=True, confirmation_prompt=True)
def cli(password):
click.echo(f'the password is {password}')
if __name__ == '__main__':
cli()
執行:
$ python test_click.py
Password:
Repeat for confirmation:
the password is 123456
$ python test_click.py -p 123456
the password is 123456
總結
Click相比argparse使用起來更加簡潔,可以實現快速構建命令列程式,當然在擴充套件性上就沒有argparse庫好。本文只介紹了click的部分功能,更詳細的用法可參考:
- click庫官方文件:https://click.palletsprojects.com/en/8.0.x/
- click庫中文文件:https://click-docs-zh-cn.readthedocs.io/zh/latest/