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()
运行示例:
💻 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()
📝 练习¶
- 创建一个支持多个参数的训练脚本
- 实现一个文件批量重命名工具
- 添加进度条显示(使用tqdm)
🎯 自我检查¶
- 能使用argparse创建CLI工具
- 理解位置参数和可选参数
- 能处理用户输入
- 能设计友好的命令行界面
下一步: 05 - 类型注解与工具