目录
简述
命令行工具,用于构建命令行解释器的工具。其核心功能为解释命令行。
常用工具
Python中常用的命令行工具包括了其本身所带的argparse库,以及社区开源的Click库。
值得一提的是,Python中最受欢迎的web框架之一的Flask的命令行就是基于Click进行开发的。
argparse
功能简述
- 参数解析
- 无效参数错误提示
- 帮助和使用消息
快速使用
import argparse
parser = argparse.ArgumentParser(description="Hello argparse")
parser.add_argument("name", type=str, help="请输入你的名字")
args = parser.parser_args()
print(args.accumulate(args.name))
使用流程
- STEP1: 构建解析器
parser = argparse.ArgumentParser(description="一个命令行解析器!")
- STEP2: 为解析器添加解析参数
parser.add_argument("name", type=str, help="你的名字")
- STEP3: 进行参数解析
parser.parse_args()
高级功能
解析器继承
parent_parser = argparse.ArgumentParser(add_help=False)
parent_parser.add_argument("--name", type=str)
child1_parser = argparse.ArgumentParser(parents=[parent_parser])
child1_parser.add_argument("--childname", type=str)
child2_parser = argparser.ArgumentParser(parents=[parent_parser])
child2_parser.add_argument("--child2name", type=str)
这种写法的好处比较显而易见,就是可以共享公共参数,减少代码的重复率。
父解析器添加add_help=False参数,此举的意义在于防止在使用help时会产生来自父解析器的-h/–help行。
子命令解析
parser = argparse.ArgumentParser()
parser_child = parser.add_sub_parsers("child", help="child parser")
parser_child.add_argument("num", type=int, help="Num")
parser.parse_args()
对于子命令的支持能够是的我们把一个命令行解析的流程进行比较好的逻辑切割,当然需要通过一些手段来进行此行为。
Click
安装流程
pip install click
功能简述
- 命令行解析
- 帮助文本生成
- 运行时延迟加载子命令
快速使用
import click
@click.command()
@click.option("--name", default="Unkown", help="用户名称")
def hello(name):
...
if __name__ == "__main__":
hello()
使用流程
- STEP1: 构建命令行运行函数
def hello(name):
...
- STEP2: 为命令行执行程序添加命令行解释器
@click.command()
@click.option("--name", help="用户名称")
def hello(name):
...
高级功能
Prompt支持
@click.command()
@click.option("--name", prompt="You name password")
@click.option("--password", prompt=True, hide_input=True, confirmation_prompt=True)
def hello(name, password):
....
Click支持prompt输入模式,也就是能够在指令执行的同时进行动态输入的方法。同时支持隐藏输入,以及重复确认等功能。
Environment变量支持
@click.command()
@click.option("--username")
def greet(username):
...
if __name__ == "__main__":
greet(auto_envvar_prefiex="GRETTER")
通过该设置可以在环境变量中获取该变量值。
export GRETTER_USERNAME=lipo
帮助文档定制
@click.command()
@click.option("--count", default=1, help="The Count of you", short_help="count[m]")
def hello(count):
"""The is the help main Context \f
:param count: count of m
"""
通过参数、函数文档以及转义字符\f可以实现对于帮助文档的自定义过程。
输入颜色支持
该功能需要colorama的库进行支撑。
pip install colorama
import click
click.echo(click.style("Hello World!", fg="white", bg="blue"))
click.secho("Hello World!", fg="green")
通过该库可以实现输出颜色自动化的流程。
输出分页支持
@click.command()
def less():
click.echo_via_pager("\n".join(f"Page: {_}" for _ in range(10)))
通过此可以实现对于命令中的分页支持。
进度条支持
with click.progressbar(all_process, label="xxx", length=len_num) as bar:
for _ in bar:
do(_)
with click.progressbar(length=total_size,
label="xxx") as bar:
bar.update(xxx_size)
实现简单的进度条的支持,若要实现更复杂的进度条,可以通过专用的进度条的库来进行实现,后续作者有时间会进行关于Python进度条的专用库介绍。
参比
Click vs argparse
作为参比,我们这里采用三个主要方向作为讨论方向,1、命令行解析能力,2、命令行交互体验,3、命令行帮助功能支持。
1、命令行解析能力
argparse和Click的对于命令行的解释能力都不错,但是稍有不同,不同之处在与公共参数的部分,Click严格区分了不同的命令指令的选项支持。因此,当想要为Click库定制公共参数的时候,需要做出更多的努力,需要使用到上下文机制以及pass_context功能。在这一点上,argparse的体验上优于Click。
2、命令行交互体验
相比于Click,argparse只专注于命令行解析的部分,因此在交互体验的设计上,Click的功能比argparse更加的细致具体一些。比如彩色输出、prompt支持、简单progressbar支持、分页等,而argparse的在这些能力领域对于这些功能的支持并不如意,为了要实现这些功能,可能还需要安装更多的库进行支撑,因此在这一点上Click的功能强与argparse。
3、命令行帮助功能支持
相比于argparse采用help参数和formatter实现对于帮助文档的定制支持,而Click采用参数加上函数注释和转义字符的方式实现对于帮助文档的定制。一般来说,只需要一些简单的参数也就满足了需求,但是某些特定的情况下,需要更复杂的手段,其实两者在这个方向上,其实都差不多。
除了这些方向之外,Click对于不同的命令行逻辑的分割做的很好,通过装饰器这种语法糖的写法,能够让人的很容易进行逻辑划分,而argparse在代码分割上并没有给予直接的支撑,但是可以通过一些努力来实现。社区活跃度上而言,Click的w/s/f的数据为186/10.7k/1.1k。最近的仍在活跃更新,argparse作为被Python收编的内置库,社区方面可能不如Click支撑来的丰富。
总结
如何选择?
其实,如何选择这个问题,没有标准答案,命令行流程不复杂,且不需要太多丰富的功能,想抬手就用的话,建议使用argparse。而若是更加复杂的功能,则可以通过Click库实现支撑。当然有些人可能比较讨厌自己的requirements.txt列表过程,直接采用argparse也是一种选择。但是作为Python语言的使用者,如果不能够利用Python最大的优势-快捷编程,是在是一个不智的选择。
本文对比了Python中两个常用的命令行工具Click和argparse,从命令行解析能力、交互体验和帮助功能支持三个方面进行讨论。Click在交互体验上表现出色,支持彩色输出、prompt和进度条,而argparse在命令行解析和帮助功能上有其优势。选择哪个工具取决于项目需求的复杂性和对功能的需求。

被折叠的 条评论
为什么被折叠?



