如何使用Python ipaddress模块从10.0.0.0/8主网段中排除已部署子网
实现方案
你报错的核心原因是address_exclude仅支持对单个IPv4Network对象调用,第一次调用后返回的是生成器/列表,自然无法继续调用该方法。你可以通过维护一个动态更新的可用网段列表来实现需求,具体代码如下:
from ipaddress import IPv4Network # 1. 预处理已用网段:去重后按前缀长度从大到小排序,先处理小子网减少后续拆分次数 ipranges = sorted(list(set(ipranges)), key=lambda net: net.prefixlen, reverse=True) # 2. 初始化可用网段池,初始为整个10.0.0.0/8 available_ranges = [IPv4Network("10.0.0.0/8")] # 3. 逐个排除已用网段 for used_net in ipranges: temp_available = [] for current_net in available_ranges: # 无重叠的网段直接保留 if not current_net.overlaps(used_net): temp_available.append(current_net) continue # 有重叠则拆分出排除后的剩余网段 try: split_nets = list(current_net.address_exclude(used_net)) temp_available.extend(split_nets) except ValueError: # 触发异常一般是已用网段和当前可用网段完全一致,直接跳过即可 pass # 更新可用网段池 available_ranges = temp_available # 输出所有可用网段 for net in available_ranges: print(net)
逻辑说明
- 每次处理一个已用网段时,都会遍历当前所有的可用网段,只对和当前已用网段重叠的部分做拆分,不重叠的部分直接保留
- 处理完所有已用网段后,
available_ranges中存储的就是10.0.0.0/8范围内所有未被占用的网段
内容的提问来源于stack exchange,提问作者RobTheRobot16
相关产品推荐
相关产品推荐

