You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:48:12