上一篇實現了圖片的壓縮函數。如今若是須要對圖片進行壓縮,能夠調用實現的函數進行壓縮:vue
pngquant_compress('elephant.png', force=True, quality=20)
可是每次輸入 python run_script.py 沒有對應的參數傳入, 還要去改腳本參數挺麻煩的。能夠添加命令行的方式進行調用:python
python run_script.py elephant.png --force --quality 30
python 的 click 庫能夠很是方便的實現命令行調用。 click 是 flask 做者開發的。用法很簡單,只須要添加裝飾器在須要運行的程序上就能夠了:git
當我輸入 python demo.py —help 的時候, 會顯示命令行幫助信息:flask
能夠在函數上添加 @click.argument('arg_name')
:markdown
import click @click.argument("arg_name") def pngquant_compress():
當程序沒有填入必填參數時,將會提示:app
option 是 click 的重點,比 argument 要靈活不少。他的表示方法和 argument 差很少:函數
import click @click.option("--force") def pngquant_compress(): pass
若是想用多個名稱同時表示一個參數,只須要繼續在 option 方法中添加位置參數, 就能夠經過 -f
, --violent
的形式
傳入可選參數:工具
import click @click.option("--force", "-f", "--violent") def pngquant_compress(): pass
若是不想以 --force value
的形式傳入值,也能夠直接經過 flag 形式,不傳入任何值:post
import click @click.option("--force", "-f", "--violent", is_flag=True) def pngquant_compress(): pass
顯示提示信息:ui
import click @click.option( "--force", "-f", "--violent", is_flag=True, help="強制執行" ) def pngquant_compress(): pass
好比 quality 參數傳入的能夠是數字 20, 也能夠是 20-30 這種形式。這時候須要自定義一種數據類型進行校驗。
class QualityInteger(click.ParamType): name = "QualityInteger" def convert(self, value, param, ctx): if value.isdigit(): return int(value) try: min_v, max_v = value.split('-') int(min_v), int(max_v) return value except ValueError: self.fail('參數不符合相似 20-30 或者 30 的規範')
此時若是輸入的參數沒有經過檢驗,命令行會提示錯誤:
\picom>python demo_06_封裝成命令行.py elephant.png -q 20-4a Usage: demo_06_封裝成命令行.py [OPTIONS] FP Error: Invalid value for "--quality" / "-q": 參數不符合相似 20-30 或者 30 的規範
from setuptools import setup, find_packages setup( name='picom', version='0.1', install_requires=[ 'Click', 'requests' ], )
setup.cfg 配置文件:
[metadata] name = picom description = A app to compress images. [options] packages = find: package_dir = = src include_package_data = true python_requires = >= 3.6 [options.packages.find] where = src [options.entry_points] console_scripts = picom = picom.cli:cli
把 picom 模塊放入依賴包路徑,執行 pip install --editable .
能夠安裝這個模塊。
安裝完成之後,能夠在 python 解釋器路徑看到 picom.exe 命令行文件。建議建立虛擬環境安裝,以避免對系統環境形成污染。
以前在 pngquant_compress 函數中使用 pngquant 命令行是採用環境變量,如今既然是經過 picom 命令去執行,就能夠把 pngquant
的環境變量去掉。
首先須要在 picom 包中添加一個 ext 的包存放 pngquant 的執行文件。
修改原來的調用函數:
# pngquant.py # 原來的寫法 command = f'pngquant {fp} --skip-if-larger {force_command} {quality_command}' # 新寫法,直接調用 ext/ 下的可執行文件,而不是環境變量中的 pngquant pngquant_cmd = Path(__file__).resolve().parent / 'ext' / 'pngquant' command = f'{pngquant_cmd} {fp} --skip-if-larger {force_command} {quality_command}'
經過 click 庫和 setuptool 打包,picom 壓縮工具使用變得比較簡單:
picom elephant.png