我写了几年Python,最头疼的是给脚本加交互功能。以前要么用input()一行行问,要么用argparse写一堆参数。input()太简陋,argparse参数一多记不住。直到我试了 click 这个库,感觉打开了新世界。
click用起来特别方便。装好之后,加一行 @click.command(),函数就变成命令行工具。加参数更简单,@click.option('--name') 就搞定。不需要自己解析参数,不会写错。
我举个真实例子。上周帮同事写个批量改文件名的工具。以前用argparse,要定义参数类型,加帮助信息,大概要写30行。用click,10行就搞定。
import click
@click.command()
@click.option('--path', prompt='文件夹路径', help='要处理的文件夹')
@click.option('--prefix', prompt='前缀', help='要加的前缀')
def rename_files(path, prefix):
改文件名逻辑
pass
if __name__ == '__main__':
rename_files()
同事拿到后,直接在终端运行。程序自动弹出输入提示,问他文件夹路径和前缀。不用记参数名,不用看文档。他说“这比我写过的所有工具都好用”。
click最大的好处是交互自然。你可以加prompt让用户输入,可以加choice限制选项,可以加password隐藏输入。比如写个数据库迁移工具,输入密码时自动隐藏,用户感觉特别专业。
它还能让你不用再担心参数顺序。用argparse时,用户输错顺序会报错。click的option参数名就是标识符,你写 --name xxx --age yy 还是 --age yy --name xxx 都没问题。这对非程序员特别友好。
我有个朋友用这个库写了个下载工具。他用click的 @click.group() 实现了子命令。比如 down tool video 下载视频,down tool music 下载音乐。用户一看就明白,不用学额外知识。
click还有现成的progress bar。写下载脚本时,加一行 with click.progressbar(files) as bar,终端就显示进度条。用户能看到正在处理第几个文件,还剩多少。这比打印“处理中……”高大上得多。
我用click写过日志分析工具、配置管理脚本、自动化部署助手。每次写完,同事都说好用。他们不需要看代码,不需要记参数,跟着提示走就行。节省了大量教人使用的时间。
如果你还在用input()或argparse写命令行工具,建议试试click。装一次就记住:pip install click。然后你的脚本就能变成真正的交互式程序。用户愿意用,你也愿意写。