跳转至

04 - 命令行工具

学习时间: 1小时 重要性: ⭐⭐⭐⭐ 让脚本更专业


🎯 学习目标

  • 掌握argparse的基本用法
  • 学会处理命令行参数
  • 构建友好的CLI工具

🎪 argparse - 命令行参数解析

基本用法

Python
import argparse

# 创建解析器
parser = argparse.ArgumentParser(description="我的脚本")

# 添加位置参数
parser.add_argument("filename", help="输入文件名")

# 添加可选参数
parser.add_argument("-v", "--verbose", action="store_true", help="详细输出")
parser.add_argument("-o", "--output", help="输出文件名")

# 解析参数
args = parser.parse_args()

# 使用参数
if args.verbose:
    print(f"处理文件: {args.filename}")

if args.output:
    print(f"输出到: {args.output}")

参数类型

Python
parser = argparse.ArgumentParser()

# 位置参数
parser.add_argument("input", help="输入文件")

# 可选参数(短选项和长选项)
parser.add_argument("-c", "--count", type=int, help="重复次数")

# 带默认值
parser.add_argument("--max-size", type=int, default=100, help="最大大小")

# 必需的可选参数
parser.add_argument("--api-key", required=True, help="API密钥")

# 选择性参数
parser.add_argument("--mode", choices=["train", "test", "predict"], default="train")

# 多个值
parser.add_argument("files", nargs="+", help="多个文件")

# 计数器
parser.add_argument("-v", "--verbose", action="count", default=0, help="详细程度")

args = parser.parse_args()

完整示例

Python
import argparse

def main():
    parser = argparse.ArgumentParser(
        description="文件处理工具",
        formatter_class=argparse.RawDescriptionHelpFormatter
    )

    # 输入输出
    parser.add_argument("input", help="输入文件")
    parser.add_argument("-o", "--output", help="输出文件")

    # 选项
    parser.add_argument("-v", "--verbose", action="store_true", help="详细输出")
    parser.add_argument("-n", "--number", type=int, default=10, help="处理数量")
    parser.add_argument("--format", choices=["json", "csv"], default="json", help="输出格式")

    # 互斥参数
    group = parser.add_mutually_exclusive_group()
    group.add_argument("--compress", action="store_true", help="压缩输出")
    group.add_argument("--decompress", action="store_true", help="解压缩")

    args = parser.parse_args()

    # 业务逻辑
    if args.verbose:
        print(f"输入: {args.input}")
        print(f"输出: {args.output}")
        print(f"数量: {args.number}")
        print(f"格式: {args.format}")

if __name__ == "__main__":
    main()

运行示例:

Bash
python script.py input.txt -o output.txt -v --format csv --number 20


💻 sys - 系统参数

Python
import sys

# 命令行参数(简单场景)
# sys.argv[0] 是脚本名
# sys.argv[1:] 是参数列表

if len(sys.argv) < 2:
    print("用法: python script.py <filename>")
    sys.exit(1)

filename = sys.argv[1]
print(f"处理文件: {filename}")

# 退出码
sys.exit(0)   # 正常退出
sys.exit(1)   # 错误退出

# 标准输入输出
print("输入内容: ")
user_input = sys.stdin.readline().strip()
print(f"你输入了: {user_input}")

# Python版本
print(sys.version)

# 平台信息
print(sys.platform)  # win32, linux, darwin

💡 实用场景

场景1: 训练脚本

Python
import argparse

def train_model(args):
    print(f"训练模型")
    print(f"数据: {args.data}")
    print(f"轮数: {args.epochs}")
    print(f"批次大小: {args.batch_size}")
    print(f"学习率: {args.learning_rate}")
    print(f"使用GPU: {args.use_gpu}")

def main():
    parser = argparse.ArgumentParser(description="模型训练脚本")
    parser.add_argument("--data", required=True, help="训练数据路径")
    parser.add_argument("--epochs", type=int, default=100, help="训练轮数")
    parser.add_argument("--batch-size", type=int, default=32, help="批次大小")
    parser.add_argument("--learning-rate", type=float, default=0.001, help="学习率")
    parser.add_argument("--use-gpu", action="store_true", help="使用GPU")

    args = parser.parse_args()
    train_model(args)

if __name__ == "__main__":
    main()

场景2: 批量处理工具

Python
import argparse
from pathlib import Path

def process_files(pattern, output_dir, verbose=False):
    """批量处理文件"""
    files = list(Path(".").glob(pattern))
    output = Path(output_dir)
    output.mkdir(exist_ok=True)

    for i, file in enumerate(files, 1):  # enumerate()同时获取索引和值,避免手动计数
        if verbose:
            print(f"[{i}/{len(files)}] 处理: {file.name}")

        # 处理逻辑...
        pass

    print(f"完成!处理了 {len(files)} 个文件")

def main():
    parser = argparse.ArgumentParser(description="批量文件处理工具")
    parser.add_argument("pattern", help="文件匹配模式(如 *.txt)")
    parser.add_argument("-o", "--output", default="output", help="输出目录")
    parser.add_argument("-v", "--verbose", action="store_true", help="详细输出")

    args = parser.parse_args()
    process_files(args.pattern, args.output, args.verbose)

if __name__ == "__main__":
    main()

📝 练习

  1. 创建一个支持多个参数的训练脚本
  2. 实现一个文件批量重命名工具
  3. 添加进度条显示(使用tqdm)

🎯 自我检查

  • 能使用argparse创建CLI工具
  • 理解位置参数和可选参数
  • 能处理用户输入
  • 能设计友好的命令行界面

下一步: 05 - 类型注解与工具