Python argparse如何支持单个IP、IP列表、IP范围类型参数传入
多格式IP命令行参数实现方案
核心思路
利用argparse的type参数支持自定义转换函数的特性,在参数接收阶段直接完成格式识别、合法性校验和IP列表生成,后续业务逻辑直接遍历解析结果即可,不需要额外处理参数格式。实现全程使用Python标准库,无需安装第三方依赖。
具体实现代码
import argparse from ipaddress import ip_address def parse_ip_arg(ip_str: str) -> list: # 移除所有空白字符,兼容分隔符前后带空格的输入习惯 processed_input = ip_str.replace(" ", "").strip() ip_result = [] # 识别横杠分隔的IP段格式 if "-" in processed_input: start_raw, end_raw = processed_input.split("-", maxsplit=1) try: start_ip = ip_address(start_raw) end_ip = ip_address(end_raw) except ValueError as e: raise argparse.ArgumentTypeError(f"IP段格式非法: {ip_str}, 错误详情: {str(e)}") if start_ip > end_ip: raise argparse.ArgumentTypeError(f"IP段起始地址不能大于结束地址: {ip_str}") # 遍历生成段内所有IP current = start_ip while current <= end_ip: # 如果需要字符串格式IP,替换为 ip_result.append(str(current)) ip_result.append(current) current += 1 return ip_result # 识别逗号分隔的多离散IP格式 if "," in processed_input: ip_segments = [seg for seg in processed_input.split(",") if seg] for seg in ip_segments: try: # 如果需要字符串格式IP,替换为 ip_result.append(str(ip_address(seg))) ip_result.append(ip_address(seg)) except ValueError as e: raise argparse.ArgumentTypeError(f"IP格式非法 {seg}: {str(e)}") return ip_result # 单个IP格式 try: # 如果需要字符串格式IP,替换为 ip_result.append(str(ip_address(processed_input))) ip_result.append(ip_address(processed_input)) except ValueError as e: raise argparse.ArgumentTypeError(f"IP格式非法 {processed_input}: {str(e)}") return ip_result # 初始化argparse,指定type为自定义解析函数 parser = argparse.ArgumentParser(description='RANGES') parser.add_argument('IP_Address', action='store', type=parse_ip_arg, help='支持格式:单个IP、逗号分隔多IP、横杠分隔IP段') args = parser.parse_args() # 业务逻辑直接遍历解析后的IP列表即可 for ip in args.IP_Address: # 替换为你的实际处理逻辑 print(f"处理IP: {ip}")
兼容效果
对应需要的三种调用形式,解析结果完全符合预期:
- 执行
python3 main.py 1.1.1.1,返回仅包含1.1.1.1的列表,遍历单个IP - 执行
python3 main.py 1.1.1.1, 2.2.2.2,返回包含1.1.1.1、2.2.2.2的列表,按传入顺序遍历离散IP - 执行
python3 main.py 1.1.1.1-1.1.1.3,返回包含段内所有连续IP的列表,自动遍历从起始到结束的全部地址
说明:代码中使用Python标准库ipaddress做IP解析和校验,比手写正则的准确性更高,能自动拦截所有非法格式的IP输入,非法输入时会触发argparse原生的参数错误提示,不会抛出未捕获的异常。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

