命令行工具是自动化运维、脚手架的核心。本文对比argparse、Click、Typer三种方案,并实战开发一个CLI工具。
一、argparse基础
python
复制
下载
import argparse parser = argparse.ArgumentParser(description="文件处理工具") parser.add_argument("filename", help="输入文件") parser.add_argument("-o", "--output", default="out.txt", help="输出文件") parser.add_argument("-v", "--verbose", action="store_true") parser.add_argument("-n", "--num", type=int, default=10) args = parser.parse_args() print(args.filename, args.output, args.verbose, args.num)二、子命令
python
复制
下载
parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest="command") create = subparsers.add_parser("create") create.add_argument("name") delete = subparsers.add_parser("delete") delete.add_argument("name") args = parser.parse_args() if args.command == "create": print(f"创建 {args.name}") elif args.command == "delete": print(f"删除 {args.name}")三、Click
python
复制
下载
import click @click.group() def cli(): pass @cli.command() @click.argument("name") @click.option("--age", default=18, help="年龄") def greet(name, age): click.echo(f"Hello {name}, age {age}") @cli.command() @click.option("--count", default=1) def repeat(count): for _ in range(count): click.echo("Hello") if __name__ == "__main__": cli()四、Typer(推荐)
Typer基于类型注解,代码更简洁。
python
复制
下载
import typer from typing import Optional app = typer.Typer() @app.command() def greet(name: str, age: int = 18, verbose: bool = False): """向用户问好""" if verbose: typer.echo(f"详细模式") typer.echo(f"Hello {name}, age {age}") @app.command() def add(a: int, b: int): """两数相加""" typer.echo(a + b) if __name__ == "__main__": app()五、彩色输出
python
复制
下载
from rich.console import Console from rich.table import Table console = Console() console.print("[bold red]错误[/bold red]: 文件不存在") console.print("[green]成功[/green]") table = Table(title="用户列表") table.add_column("ID") table.add_column("姓名") table.add_row("1", "Tom") table.add_row("2", "Jerry") console.print(table)六、进度条
python
复制
下载
from rich.progress import track import time for i in track(range(100), description="处理中..."): time.sleep(0.01)
或tqdm:
python
复制
下载
from tqdm import tqdm for i in tqdm(range(100)): time.sleep(0.01)
七、配置文件
python
复制
下载
import typer from pydantic_settings import BaseSettings class Settings(BaseSettings): api_key: str = "" timeout: int = 30 @app.command() def run(config: str = "config.json"): settings = Settings() typer.echo(settings.api_key)
八、打包发布
pyproject.toml:
toml
复制
下载
[project.scripts] mytool = "mytool.cli:app" [tool.poetry] name = "mytool" version = "0.1.0"
安装后可直接命令行调用:
bash
复制
下载
pip install -e . mytool greet Tom
九、实战:文件批量重命名工具
python
复制
下载
import typer from pathlib import Path app = typer.Typer() @app.command() def rename( directory: Path, pattern: str = "*.jpg", prefix: str = "img_", dry_run: bool = False, ): """批量重命名文件""" files = sorted(directory.glob(pattern)) for i, f in enumerate(files, 1): new_name = f.parent / f"{prefix}{i:04d}{f.suffix}" if dry_run: typer.echo(f"{f} -> {new_name}") else: f.rename(new_name) typer.echo(f"重命名: {new_name}") if __name__ == "__main__": app()十、总结
argparse是标准库,Click功能强大,Typer最简洁。推荐新项目用Typer + Rich,能快速开发出专业级CLI工具。