使用 Click 創(chuàng)建自己的命令行工具

前言

image.png

本文不會從頭教你如何使用 Click,因為 Click 官網(wǎng)上有著最為全面的資料,建議直接去官網(wǎng)學習栖榨,Click 的官網(wǎng)鏈接:https://click.palletsprojects.com/

建議在學習新的知識的時候優(yōu)先查看其官網(wǎng)上的資料,官網(wǎng)上的資料往往是最全面的明刷。

本文將對自己在使用 Click 創(chuàng)建命令行工具中遇到的一些疑惑或問題進行記錄婴栽。

創(chuàng)建多層結構式的命令行應用

一個復雜命令行程序通常將會劃分為不同的層級,舉個栗子:Github CLI

$ gh --help
Work seamlessly with GitHub from the command line.

USAGE
  gh <command> <subcommand> [flags]

CORE COMMANDS
  gist:       Create gists
  issue:      Manage issues
  pr:         Manage pull requests
  release:    Manage GitHub releases
  repo:       Create, clone, fork, and view repositories

在第一層中 gh 提供了五個命令辈末,分別是 gist 愚争、issuepr挤聘、releaserepo 轰枝,它們分別對應這不同的功能,在這五個核心的命令那個之下還有著更多的命令组去,如下:

$ gh gist --help
Work with GitHub gists.

USAGE
  gh gist [flags]

CORE COMMANDS
  create:     Create a new gist
  edit:       Edit one of your gists
  list:       List your gists
  view:       View a gist

我們可以看到 gist 命令下也有子命令鞍陨,分別是 createedit从隆、listview 诚撵。

那么使用 Click 也可以創(chuàng)建這種多層結構式的命令行應用,代碼如下:

import click


@click.group()
def cli():
    pass


@click.group()
def command_1():
    pass


@command_1.command()
def command_1_1():
    click.echo('command-1-1')


@click.group()
def command_2():
    pass


@command_2.command()
def command_2_1():
    click.echo('command-2-1')


cli.add_command(command_1)
cli.add_command(command_2)

if __name__ == '__main__':
    cli()

上述代碼的輸出如下:

$ python main.py
Usage: main.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  command-1
  command-2

$ python main.py command-1
Usage: main.py command-1 [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  command-1-1

Click.Path 類型的默認值

Click 可以指定輸入?yún)?shù)的類型键闺,具體的文檔可以查看相應的官方文檔:https://click.palletsprojects.com/en/7.x/api/#types

其中如果將文件路徑作為參數(shù)傳遞給命令行砾脑,可以使用 click.Path 作為其參數(shù)的類型,默認值可以設置為字符串類型艾杏,代碼如下:

import click


@click.command()
@click.argument('file', default='./test.txt', type=click.Path())
def cat(file):
    click.echo(open(file, 'r').read())


if __name__ == '__main__':
    cat()

輸出如下:

$ python main.py 
Hello World

同時也可以使用 click 確保文件一定存在韧衣,代碼為 @click.argument('file', default='./test.txt', type=click.Path(exists=True)),這時必須保證默認的參數(shù)對應的文件也是存在的购桑,否則程序就會排除異常畅铭。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勃蜘,隨后出現(xiàn)的幾起案子硕噩,更是在濱河造成了極大的恐慌,老刑警劉巖缭贡,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炉擅,死亡現(xiàn)場離奇詭異,居然都是意外死亡阳惹,警方通過查閱死者的電腦和手機谍失,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莹汤,“玉大人快鱼,你說我怎么就攤上這事。” “怎么了抹竹?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵线罕,是天一觀的道長。 經(jīng)常有香客問我窃判,道長钞楼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任袄琳,我火速辦了婚禮询件,結果婚禮上,老公的妹妹穿的比我還像新娘跨蟹。我一直安慰自己雳殊,他們只是感情好橘沥,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布窗轩。 她就那樣靜靜地躺著,像睡著了一般座咆。 火紅的嫁衣襯著肌膚如雪痢艺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天介陶,我揣著相機與錄音堤舒,去河邊找鬼。 笑死哺呜,一個胖子當著我的面吹牛舌缤,可吹牛的內容都是我干的。 我是一名探鬼主播某残,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼国撵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玻墅?” 一聲冷哼從身側響起介牙,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澳厢,沒想到半個月后环础,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡剩拢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年线得,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片徐伐。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡框都,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情魏保,我是刑警寧澤熬尺,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布讨韭,位于F島的核電站瘸爽,受9級特大地震影響,放射性物質發(fā)生泄漏谷徙。R本人自食惡果不足惜檩咱,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一揭措、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刻蚯,春花似錦绊含、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讨便,卻和暖如春充甚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霸褒。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工伴找, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人废菱。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓技矮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殊轴。 傳聞我的和親對象是個殘疾皇子衰倦,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354