
argparse 基础入门1.1 最简单的示例让我们从一个最简单的例子开始1importargparsebrbr# 创建解析器brparser argparse.ArgumentParser(description这是一个示例程序)brbr# 添加位置参数brparser.add_argument(name, help你的名字)brbr# 解析参数brargs parser.parse_args()brbrprint(f你好{args.name})运行效果1$ python hello.py Alicebr你好Alice1.2 核心概念ArgumentParser参数解析器所有参数的容器add_argument()添加参数的方法parse_args()解析命令行输入返回命名空间对象二、参数类型详解2.1 位置参数与可选参数1importargparsebrbrparserargparse.ArgumentParser()brbr# 位置参数必须提供brparser.add_argument(filename, help要处理的文件名)brbr# 可选参数以 - 或 -- 开头brparser.add_argument(-v, --verbose, actionstore_true, help启用详细输出)brparser.add_argument(-n, --number, typeint, default1, help重复次数)brbrargs parser.parse_args()brprint(f处理文件: {args.filename})brprint(f详细模式: {args.verbose})brprint(f重复次数: {args.number})2.2 参数类型转换argparse支持自动类型转换1parser.add_argument(--port,typeint, default8080,help端口号)brparser.add_argument(--rate,typefloat, default1.0,help比率)brparser.add_argument(--tags, nargs,help标签列表)# 接收多个值三、高级用法3.1 互斥参数组有时你需要让某些参数互斥不能同时使用1parserargparse.ArgumentParser(description文件处理工具)brgroupparser.add_mutually_exclusive_group()brgroup.add_argument(--json, actionstore_true,help以JSON格式输出)brgroup.add_argument(--csv, actionstore_true,help以CSV格式输出)brgroup.add_argument(--xml, actionstore_true,help以XML格式输出)3.2 子命令Sub-Commands像 Git 那样的子命令实现1parserargparse.ArgumentParser(description项目管理工具)brsubparsersparser.add_subparsers(destcommand,help可用命令)brbr# 创建 init 子命令brinit_parser subparsers.add_parser(init, help初始化项目)brinit_parser.add_argument(--template, defaultbasic, help项目模板)brbr# 创建 build 子命令brbuild_parser subparsers.add_parser(build, help构建项目)brbuild_parser.add_argument(--release, actionstore_true, help发布模式)brbrargs parser.parse_args()brbrif args.command init:br print(f初始化项目使用模板: {args.template})brelif args.command build:br print(f构建项目发布模式: {args.release})3.3 自定义动作Action1classCustomAction(argparse.Action):brdef__call__(self, parser, namespace, values, option_stringNone):brprint(f自定义处理: {values})brsetattr(namespace,self.dest, values.upper())brbrparser.add_argument(--name, actionCustomAction,help名称自动转为大写)四、实用技巧4.1 参数验证1defcheck_port(value):br ivalueint(value)brifnot(1ivalue 65535):brraiseargparse.ArgumentTypeError(f{value} 不是有效的端口号)brreturnivaluebrbrparser.add_argument(--port,typecheck_port, default8080)4.2 从文件读取参数1parser.add_argument(--config,typeargparse.FileType(r),help配置文件)brbr# 或使用 fromfile_prefix_charsbrparser argparse.ArgumentParser(fromfile_prefix_chars)br# 然后可以: python script.py args.txt4.3 美化帮助信息1parserargparse.ArgumentParser(br progmytool,br usage%(prog)s [options] filename,br description%(prog)s 是一个强大的文件处理工具,br epilog示例: mytool data.txt --verbose --output result.txt,br formatter_classargparse.RawDescriptionHelpFormatterbr)五、完整实战示例下面是一个完整的日志分析工具1#!/usr/bin/env python3br# log_analyzer.py - 日志分析工具brbrimport argparsebrimport rebrfrom collections import Counterbrbrdef analyze_log(filename, patternNone, top_n10, outputNone):br 分析日志文件br with open(filename, r, encodingutf-8) as f:br lines f.readlines()br br # 过滤匹配的行br if pattern:br regex re.compile(pattern)br lines [line for line in lines if regex.search(line)]br br # 统计IP地址br ip_pattern re.compile(r\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b)br ips []br for line in lines:br ips.extend(ip_pattern.findall(line))br br ip_counts Counter(ips).most_common(top_n)br br # 输出结果br result f\n分析结果 ({len(lines)} 行匹配):\nbr result *40 \nbr result Top {} IP 地址:\n.format(top_n)br for ip, count in ip_counts:br result f {ip}: {count} 次\nbr br if output:br with open(output, w) as f:br f.write(result)br print(f结果已保存到: {output})br else:br print(result)brbrdef main():br parser argparse.ArgumentParser(br proglog_analyzer,br descriptionWeb日志分析工具 - 统计访问IP和请求,br epilog示例: log_analyzer access.log --pattern 404 --top 5br )br br parser.add_argument(logfile, help日志文件路径)br parser.add_argument(-p, --pattern, help过滤正则表达式)br parser.add_argument(-t, --top, typeint, default10, help显示前N个IP (默认: 10))br parser.add_argument(-o, --output, help输出结果到文件)br parser.add_argument(-v, --verbose, actionstore_true, help详细模式)br br args parser.parse_args()br br if args.verbose:br print(f开始分析: {args.logfile})br br analyze_log(args.logfile, args.pattern, args.top, args.output)brbrif __name__ __main__:br main()六、argparse vs 其他选择