命令行工具是你作为开发者可以构建的最实际有用的东西之一。构建良好的CLI工具可以自动化重复任务、与其他工具集成,并分发给同事或公众。以下是如何用Python构建一个好的CLI工具。
为什么选Python做CLI
Python的CLI开发生态系统非常出色:丰富的库支持、跨平台兼容性、其他人可以维护的可读代码,以及几乎所有CLI用例都足够快的速度。对于性能关键型工具,替代方案是Go(编译为单个二进制文件,启动非常快,非常适合分发)或Rust(最大性能,不断增长的CLI生态系统)。Python的CLI弱点:启动时间(导入模块需要0.1到0.3秒,如果工具每天运行数千次则很明显)、没有单文件二进制分发(需要安装Python,或使用PyInstaller/Nuitka构建可执行文件)。对于大多数开发者工具用例,Python是正确的选择。
参数解析层
不要直接使用sys.argv。使用Click(大多数CLI工具最好的库)、Typer(带类型注解的Click包装器,编写更快)或argparse(内置,更冗长,适合简单工具)。Click示例:接受文件路径和可选详细标志的CLI:`@click.command() / @click.argument(‘filepath’) / @click.option(‘–verbose’, ‘-v’, is_flag=True) / def process(filepath, verbose): …` Click处理:帮助文本生成、输入验证、子命令分组(git风格命令)和错误消息。Typer使用Python类型注解代替装饰器,使代码更易读和IDE友好。对于有3个以上子命令的工具:Click或Typer。对于简单的单一用途工具:argparse就足够了。
配置和状态
用户重复运行的CLI工具需要持久化配置。模式:将配置存储在platformdirs.user_config_dir()中(跨平台,返回适当的操作系统特定路径:Linux/Mac上的~/.config/toolname/,Windows上的%APPDATA%/toolname/)。使用TOML(Python 3.11+的tomllib,或早期版本的tomli)用于配置文件——比JSON更易读,支持注释。对于API密钥和秘密:使用keyring库(连接macOS钥匙串、Windows凭证锁和Linux上的gnome-keyring)而不是在纯文本配置文件中存储秘密。`toolname config set api-key xxx`模式让用户只需配置一次,无需编辑文件。
输出和错误处理
好的CLI输出规则:使用Rich(Python库)进行格式化终端输出——表格、进度条、彩色文本,以及在非TTY输出时(当被管道传输时)的自动回退。将错误打印到stderr,而非stdout:`click.echo(msg, err=True)`或`print(msg, file=sys.stderr)`。这允许stdout被管道传输同时错误仍然可见。退出代码很重要:成功退出0,一般错误退出1,使用错误(错误参数)退出2。使用`sys.exit(1)`或Click的异常处理,而不是让异常作为Python追溯冒泡到用户。专业的触感:长操作的进度指示器(Rich的Progress或tqdm),以及在脚本上下文中抑制信息性输出的`–quiet`标志。




