當(dāng)前位置:首頁(yè) > > HelloGitHub

一、前言

在上一篇文章中,我們初步掌握了 click的簡(jiǎn)單用法,并了解到它與 argparse和 docopt的不同。接下來,將深入介紹 click的各類用法,以讓你能輕松打造復(fù)雜的命令行程序。

在概念上, click把命令行分為 3 個(gè)組成:參數(shù)、選項(xiàng)和命令。

  • 參數(shù)就是跟在命令后的除選項(xiàng)外的內(nèi)容,比如 git add a.txt中的 a.txt就是表示文件路徑的參數(shù)
  • 選項(xiàng)就是以 -或 --開頭的參數(shù),比如 -f、--file
  • 命令就是命令行的初衷了,比如 git就是命令,而 git add中的 add則是 git的子命令
本系列文章默認(rèn)使用 Python 3 作為解釋器進(jìn)行講解。
若你仍在使用 Python 2,請(qǐng)注意兩者之間語(yǔ)法和庫(kù)的使用差異哦~

二、參數(shù)

2.1 基本參數(shù)

基本參數(shù)就是通過位置里指定參數(shù)值。

比如,我們可以指定兩個(gè)位置參數(shù) x和 y,先添加的 x位于第一個(gè)位置,后加入的 y位于第二個(gè)位置。那么在命令行中輸入 1 2的時(shí)候,分別對(duì)應(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表示浮點(diǎn)型
  • bool/ click.BOOL表示布爾型。很棒之處在于,它會(huì)識(shí)別表示真/假的字符。對(duì)于 1、yes、y和 true會(huì)轉(zhuǎn)化為 True;0、no、n和 false會(huì)轉(zhuǎn)化為 False
  • click.UUID表示 UUID,會(huì)自動(dòng)將參數(shù)轉(zhuǎn)換為 uuid.UUID對(duì)象
  • click.FILE表示文件,會(huì)自動(dòng)將參數(shù)轉(zhuǎn)換為文件對(duì)象,并在命令行結(jié)束時(shí)自動(dòng)關(guān)閉文件
  • click.PATH表示路徑
  • click.Choice表示選擇選項(xiàng)
  • click.IntRange表示范圍選項(xiàng)

argparse一樣,click也支持自定義類型,需要編寫 click.ParamType的子類,并重載 convert方法。

官網(wǎng)提供了一個(gè)例子,實(shí)現(xiàn)了一個(gè)整數(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) # 此時(shí) input 為文件對(duì)象,每次讀入 1024 字節(jié) if not chunk: break output.write(chunk) # 此時(shí) output 為文件對(duì)象,寫入上步讀入的內(nèi)容 

2.4 文件路徑參數(shù)

文件路徑參數(shù)用來處理文件路徑,可以對(duì)路徑做是否存在等檢查,通過 type=click.Path指定。不論文件名是 unicode 還是字節(jié)類型,獲取到的參數(shù)類型都是 unicode 類型。

@click.command() @click.argument('filename', type=click.Path(exists=True))  # 要求給定路徑存在,否則報(bào)錯(cuò) def hello(filename): click.echo(click.format_filename(filename))

如果文件名是以 -開頭,會(huì)被誤認(rèn)為是命令行選項(xiàng),這個(gè)時(shí)候需要在參數(shù)前加上 --和空格,比如

$ python hello.py -- -foo.txt
-foo.txt

2.5 選擇項(xiàng)參數(shù)

選擇項(xiàng)參數(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ù)用來定義一個(gè)參數(shù)可以有多個(gè)值,且能通過 nargs來定義值的個(gè)數(shù),取得的參數(shù)的變量類型為元組。

nargs=N,N為一個(gè)數(shù)字,則要求該參數(shù)提供 N 個(gè)值。若 N為 -1則接受提供無數(shù)量限制的參數(shù),如:

@click.command() @click.argument('foo', nargs=-1) @click.argument('bar', nargs=1) def hello(foo, bar): pass 

如果要實(shí)現(xiàn) argparse中要求參數(shù)數(shù)量為 1 個(gè)或多個(gè)的功能,則指定 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.py
hello.txt

而在 argparse中,則需要自己從環(huán)境變量中讀取。

三、小節(jié)

本文講解了 click中基本參數(shù)的用法,在此基礎(chǔ)上介紹了各種類型的參數(shù),最后說明了從環(huán)境變量中獲取參數(shù)值的寫法。

在下一篇文章中,我們來繼續(xù)深入了解 click的功能,看看它都支持什么樣的“選項(xiàng)”。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉