Python 命令行之旅:深入 click 之參數(shù)篇(python的click)
作者:HellogitHub-Prodesire
涉及的示例代碼,已同步更新到 HelloGitHub-Team 倉庫[1]
一、前言
在上一篇文章中,我們初步掌握了 click 的簡單用法,并了解到它與 argparse 和 docopt 的不同。接下來,將深入介紹 click 的各類用法,以讓你能輕松打造復(fù)雜的命令行程序。
在概念上, click 把命令行分為 3 個組成:參數(shù)、選項和命令。
- 參數(shù) 就是跟在命令后的除選項外的內(nèi)容,比如 git add a.txt 中的 a.txt 就是表示文件路徑的參數(shù)
- 選項 就是以 – 或 — 開頭的參數(shù),比如 -f、–File
- 命令 就是命令行的初衷了,比如 git 就是命令,而 git add 中的 add 則是 git 的子命令
本系列文章默認(rèn)使用 Python 3 作為解釋器進(jìn)行講解。若你仍在使用 Python 2,請注意兩者之間語法和庫的使用差異哦~
二、參數(shù)
2.1 基本參數(shù)
基本參數(shù) 就是通過位置里指定參數(shù)值。
比如,我們可以指定兩個位置參數(shù) x 和 y ,先添加的 x 位于第一個位置,后加入的 y 位于第二個位置。那么在命令行中輸入 1 2的時候,分別對應(yīng)到的就是 x 和 y:
@click.command()@click.argument(‘x’)@click.argument(‘y’)def hello(x, y): print(x, y)
2.2 參數(shù)類型
參數(shù)類型 就是將參數(shù)值作為什么類型去解析,默認(rèn)情況下是字符串類型。我們可以通過 type 入?yún)碇付▍?shù)類型。
click 支持的參數(shù)類型多種多樣:
- str / click.STRING 表示字符串類型,這也是默認(rèn)類型
- int / click.INT 表示整型
- float / click.FLOAT 表示浮點型
- BOOL / click.BOOL 表示布爾型。很棒之處在于,它會識別表示真/假的字符。對于 1、yes、y 和 true 會轉(zhuǎn)化為 True;0、no、n 和 false 會轉(zhuǎn)化為 False
- click.UUID 表示 UUID,會自動將參數(shù)轉(zhuǎn)換為 uuid.UUID 對象
- click.FILE 表示文件,會自動將參數(shù)轉(zhuǎn)換為文件對象,并在命令行結(jié)束時自動關(guān)閉文件
- click.PATH 表示路徑
- click.Choice 表示選擇選項
- click.IntRange 表示范圍選項
同 argparse 一樣,click 也支持自定義類型,需要編寫 click.ParamType 的子類,并重載 convert 方法。
官網(wǎng)提供了一個例子,實現(xiàn)了一個整數(shù)類型,除了普通整數(shù)之外,還接受十六進(jìn)制和八進(jìn)制數(shù)字, 并將它們轉(zhuǎn)換為常規(guī)整數(shù):
class BasedIntParamType(click.ParamType): name = “integer” def convert(self, value, param, ctx): try: if value[:2].lower() == “0x”: return int(value[2:], 16) elif value[:1] == “0”: return int(value, 8) return int(value, 10) except TypeError: self.fail( “expected string for int() conversion, got ” f”{value!r} of type {type(value).__name__}”, param, ctx, ) except ValueError: self.fail(f”{value!r} is not a valid integer”, param, ctx)BASED_INT = BasedIntParamType()
2.3 文件參數(shù)
在基本參數(shù)的基礎(chǔ)上,通過指定參數(shù)類型,我們就能構(gòu)建出各類參數(shù)。
文件參數(shù) 是非常常用的一類參數(shù),通過 type=click.File 指定,它能正確處理所有 Python 版本的 unicode 和 字節(jié),使得處理文件十分方便。
@click.command()@click.argument(‘input’, type=click.File(‘rb’)) # 指定文件為二進(jìn)制讀@click.argument(‘output’, type=click.File(‘wb’)) # 指定文件為二進(jìn)制寫def inout(input, output): while True: chunk = input.read(1024) # 此時 input 為文件對象,每次讀入 1024 字節(jié) if not chunk: break output.write(chunk) # 此時 output 為文件對象,寫入上步讀入的內(nèi)容
2.4 文件路徑參數(shù)
文件路徑參數(shù) 用來處理文件路徑,可以對路徑做是否存在等檢查,通過 type=click.Path 指定。不論文件名是 unicode 還是字節(jié)類型,獲取到的參數(shù)類型都是 unicode 類型。
@click.command()@click.argument(‘filename’, type=click.Path(exists=True)) # 要求給定路徑存在,否則報錯def hello(filename): click.echo(click.format_filename(filename))
如果文件名是以 – 開頭,會被誤認(rèn)為是命令行選項,這個時候需要在參數(shù)前加上 — 和空格,比如
$ python hello.py — -foo.txt-foo.txt
2.5 選擇項參數(shù)
選擇項參數(shù) 用來限定參數(shù)內(nèi)容,通過 type=click.Choice 指定。
比如,指定文件讀取方式限制為 read-only 和 read-write:
@click.command()@click.argument(‘mode’, type=click.Choice([‘read-only’, ‘read-write’]))def hello(mode): click.echo(mode)
2.6 可變參數(shù)
可變參數(shù) 用來定義一個參數(shù)可以有多個值,且能通過 nargs 來定義值的個數(shù),取得的參數(shù)的變量類型為元組。
若 nargs=N,N為一個數(shù)字,則要求該參數(shù)提供 N 個值。若 N 為 -1 則接受提供無數(shù)量限制的參數(shù),如:
@click.command()@click.argument(‘foo’, nargs=-1)@click.argument(‘bar’, nargs=1)def hello(foo, bar): pass
如果要實現(xiàn) argparse 中要求參數(shù)數(shù)量為 1 個或多個的功能,則指定 nargs=-1 且 required=True 即可:
@click.command()@click.argument(‘foo’, nargs=-1, required=True)def hello(foo, bar): pass
2.7 從環(huán)境變量讀取參數(shù)
通過在 click.argument 中指定 envvar,則可讀取指定名稱的環(huán)境變量作為參數(shù)值,比如:
@click.command()@click.argument(‘filename’, envvar=’FILENAME’)def hello(filename): print(filename)
執(zhí)行如下命令查看效果:
$ FILENAME=hello.txt python3 hello.pyhello.txt
而在 argparse 中,則需要自己從環(huán)境變量中讀取。
三、小節(jié)
本文講解了 click 中基本參數(shù)的用法,在此基礎(chǔ)上介紹了各種類型的參數(shù),最后說明了從環(huán)境變量中獲取參數(shù)值的寫法。
在下一篇文章中,我們來繼續(xù)深入了解 click 的功能,看看它都支持什么樣的“選項”。
參考資料
[1]HelloGitHub-Team 倉庫: https://github.com/HelloGitHub-Team/Article
『講解開源項目系列』——讓對開源項目感興趣的人不再畏懼、讓開源項目的發(fā)起者不再孤單。跟著我們的文章,你會發(fā)現(xiàn)編程的樂趣、使用和發(fā)現(xiàn)參與開源項目如此簡單。歡迎留言聯(lián)系我們、加入我們,讓更多人愛上開源、貢獻(xiàn)開源~