导读:python 构建命令行应用的第三方比较有名的包除了 click 之外还有一个叫 docopt,这是一个以文档先行为目标的包。个人是比较倾向于 Click 的,看了这篇文章之后,也很快写了一个 demo。
我对命令行很着迷。
我想为自己构建一个命令行应用程序,有这个想法之后,经过一番研究,我发现 Python 自带的内置模块 argparse 是不够的。
然后,我发现了「Click」模块。所以,今天,我们将尝试使用 Python 和 Click 创建一个基本的应用程序。
安装
$ pip install click
Hello, World
让我们保持传统,首先编写一个「Hello,World」,将这个文件命名为 cli.py
import click
@click.command()
def hello():
click.echo('Hello World!')
click.echo()
向给定的文件或标准输出打印一条消息外加一个换行符,初看起来,这很像 print
函数,但它改进了对处理 Unicode 和二进制数据的支持。
command
装饰器将函数转换成一个可以被调用的命令:
if __name__ == '__main__':
hello()
调用时是这样的:
$ python hello.py
Hello World!
对应的帮助信息是这样的:
$ python hello.py --help
Usage: hello.py [OPTIONS]
Options:
--help Show this message and exit.
参数
目前,我们没有太多的计划工作,让我们给它添加一些参数。
import click
@click.command()
@click.argument('name')
def hello(name):
click.echo(f"Hello, {name}!")
if __name__ == '__main__':
hello()
运行:
$ python cli.py Anshul
Hello, Anshul!
如果没有参数,运行:
$ python cli.py
Usage: cli.py [OPTIONS] NAME
Error: Missing argument "name".
选项
顾名思义,这些是选项,不同于我们上面看到的参数,选项是可选的,不是强制性的。
import click
@click.command()
@click.option('--count', default=1, help="Number of greetings.")
@click.argument('name')
def hello(count, name):
for i in range(count):
click.echo(f"Hello, {name}!")
if __name__ == '__main__':
hello()
运行:
$ python cli.py Anshul --count 3
Hello, Anshul!
Hello, Anshul!
Hello, Anshul!
布尔 flags
有一些选项不需要任何值,他们只是 flag(即标识)。例如 --help 命令,它并不需要一个值,另一个可能在使用 cli 工具时会注意到的例子是 --version。
import click
@click.command()
@click.option('--flag', is_flag=True)
def hello(flag):
if flag:
click.echo("Our flag will sail high and above!")
else:
click.echo("Well, that didn't go as planned!")
if __name__ == '__main__':
hello()
运行:
$ python cli.py
Well, that didn't go as planned!
$ python cli.py --flag
Our flag will sail high and above!
现在就是这样,从这里开始你就可以做很多事情了
原文: How to write a command-line application using Python and Click
扩展阅读:
极光日报,极光开发者旗下媒体。
每天导读三篇英文技术文章。