写自动化脚本的时候,你是不是经常把一堆功能塞进一个.py文件里,每次要用就改改参数再运行?更优雅的做法是把它打包成一个命令行工具——像git那样,一个命令加上几个参数就能完成不同任务。Python 做这件事格外顺手,丰富的库生态让它成为 CLI 开发的首选语言。
这篇文章带你从零开始,搭建一个可直接安装、可分享的 Python 命令行工具。
第一步:选一个趁手的CLI库
Python 里做命令行工具,主流有三个选择。
argparse是标准库自带,不用额外安装。优点是零依赖,缺点是代码比较啰嗦,参数一多就写得很冗长。
click是第三方库里的老牌选手,用装饰器定义命令,代码简洁优雅。支持子命令嵌套、彩色输出、进度条,功能很全。目前 CLI 开发用得最广的就是它。
typer基于 click 开发,结合了 Python 的类型提示,语法更现代化。如果项目已经大量使用类型注解,typer 用起来会很顺手。
个人推荐从click入手——生态成熟、文档齐全、够用不折腾。下面的例子也以 click 展开。
第二步:写一个能跑起来的CLI
先安装 click:
pip install click
创建一个cli.py文件,写一个简单的文件处理工具:
import click @click.group() def cli(): """一个简单实用的文件处理工具""" pass @cli.command() @click.argument("input", type=click.Path(exists=True)) @click.option("-o", "--output", default="output.txt", help="输出文件路径") @click.option("-v", "--verbose", is_flag=True, help="显示详细信息") def process(input, output, verbose): """处理输入文件并输出结果""" if verbose: click.echo(f"正在处理: {input}") # 这里写你的核心处理逻辑 click.echo(f"处理完成,结果已保存到: {output}") @cli.command() def clean(): """清理临时文件""" if click.confirm("确定要清理所有临时文件吗?"): click.echo("清理完成!") if __name__ == "__main__": cli()运行python cli.py --help就能看到自动生成的帮助文档。@click.group()创建了一个命令组,@cli.command()往里面挂子命令——process和clean就是两个独立的子命令,结构清晰,扩展方便。
第三步:搭好项目结构
功能跑通了,接下来把它整理成标准的 Python 项目结构,方便打包和分发:
my-tool/ ├── src/ │ └── my_tool/ │ ├── __init__.py │ └── cli.py # 命令行入口 ├── tests/ # 单元测试 ├── pyproject.toml # 项目配置(核心) ├── README.md └── LICENSE
关键文件是pyproject.toml,它是现代 Python 打包的标准配置文件:
[build-system] requires = ["hatchling>=1.10.0"] build-backend = "hatchling.build" [project] name = "my-tool" version = "0.1.0" description = "一个简单实用的命令行工具" readme = "README.md" requires-python = ">=3.8" dependencies = [ "click>=8.0.0", ] [project.scripts] my-tool = "my_tool.cli:cli"
[project.scripts]这部分是关键——它定义了安装后用户在终端敲什么命令来启动你的工具。这里配置的是敲my-tool就执行my_tool.cli里的cli()函数。
第四步:打包、安装、发布
项目结构搭好了,就可以打包安装了:
# 安装构建工具 pip install --upgrade build # 构建分发包 python -m build
执行完会在dist/目录下生成.whl和.tar.gz两个文件。本地安装测试:
pip install dist/my_tool-0.1.0-py3-none-any.whl
安装成功后,在终端直接敲my-tool --help就能用了——和用ls、git这些系统命令一模一样。
如果想分享给全世界,可以发布到 PyPI(Python 官方包仓库)。先在 注册账号,生成一个 API Token,然后:
# 安装上传工具 pip install twine # 上传到 PyPI python -m twine upload dist/
发布成功后,全世界的人都能用pip install my-tool安装你的工具了。从自己写脚本到被全球开发者使用,中间就隔了这几步。
写在最后
从写一个.py文件到做出一个能pip install的命令行工具,整个过程比想象中要短。核心就三步:用 click 写逻辑、用pyproject.toml配项目、用build和twine打包发布。
如果你手头有一些反复使用的脚本——日志分析、数据清洗、文件批量处理——不妨花一两个小时把它包装成 CLI 工具。过程本身不复杂,但做完之后的体验完全不一样:不用再打开编辑器改参数,一个命令搞定一切,顺手还能分享给同事。