前言
本文不會從頭教你如何使用 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
愚争、issue
、pr
挤聘、release
和 repo
轰枝,它們分別對應這不同的功能,在這五個核心的命令那個之下還有著更多的命令组去,如下:
$ 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
命令下也有子命令鞍陨,分別是 create
、edit
从隆、list
和 view
诚撵。
那么使用 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ù)對應的文件也是存在的购桑,否則程序就會排除異常畅铭。