Python的ipaddress模块专门设计用于处理不同类型的IP地址,并具有许多功能。可以使用此模块中的函数在Python程序中创建、操作、修改IP地址。ipaddress模块提供了许多功能,可以用来处理与IP地址相关的各种任务。例如,检查两个主机是否在同一子网内、迭代所有主机等。你可以使用ipaddress模块检查IP地址是IPv4还是IPv6、识别IP网络上的主机、识别网络的广播地址、识别IP网络重叠、在IP网络上创建子网和超网等。此外,ipaddress模块还提供了许多其他功能,可以帮助你更好地管理和操作IP地址。如果你想了解更多关于ipaddress模块的信息,可以查看官方文档。最后,需要特别说明的是ipaddress模块是python的内置模块,无需安装就可以直接使用。
本文介绍如何使用python ipaddress模块来实现工作中遇到的一个小任务,这个任务的目的是随机生成ip地址,但是随机生成的ip需要从所有约束条件限定的ip范围内随机选择。
单个约束条件支持如下三种形式:
ip地址,格式为x.x.x.x
ip区间,格式为x.x.x.x-x.x.x.x
ip网段,格式为x.x.x.x/m
在开始具体任务之前,先来熟悉一下会使用到的ipaddress模块的几个基本方法,其实也就是ip_address、ip_network两个方法而已。
ip_address方法
ip_address方法接受整数或ip形式的字符串作为参数,生成IPv4Address对象
>>> import ipaddress
>>> ip=ipaddress.ip_address(3232236291)
>>> ip
IPv4Address('192.168.3.3')
>>> ip=ipaddress.ip_address("192.168.3.3")
>>> ip
IPv4Address('192.168.3.3')
ip_network方法
ip_network方法接受ip网段形式的字符串作为参数,生成IPv4Address对象
>>> ip=ipaddress.ip_network("192.168.3.0/255.255.255.0")
>>> ip
IPv4Network('192.168.3.0/24')
>>> ip=ipaddress.ip_network("192.168.3.0/26")
>>> ip
IPv4Network('192.168.3.0/26')
IPv4Address对象转换
上面两个方法都生成了IPv4Address对象,可以使用str方法将其转换为ip地址的字符串形式,int方法将其转换为整数形式
>>> ip=ipaddress.ip_address(3232236291)
>>> ip
IPv4Address('192.168.3.3')
>>> str(ip)
'192.168.3.3'
>>> int(ip)
3232236291
生成随机ip
利用上面几个方法可以轻松解决这个随机生成ip的任务,参考代码如下,关键部分已添加注释
import random
import ipaddress
def random_ipv4(seeds):
"""从列表seeds中随机生成一个ipv4地址并返回,要求如下:
1. seeds列表中的值可以为ip地址、ip区间(A.B.C.D-A.B.C.D)、ip+掩码格式(A.B.C.D/M)。
2. 生成的随机ip地址必须满足seeds中表示的ip范围内选择。
"""
ipinfo = random.choice(seeds)
if "-" in ipinfo:
# IP区间 A.B.C.D-A.B.C.D
ip_start, ip_end = ipinfo.split("-")
# ip区间最小值
ip_min = int(ipaddress.ip_address(ip_start))
# ip区间最大值
ip_max = int(ipaddress.ip_address(ip_end))
return str(ipaddress.ip_address(random.randint(ip_min, ip_max)))
elif "/" in ipinfo:
# IP掩码 A.B.C.D/M
return str(random.choice(list(ipaddress.ip_network(ipinfo))))
else:
# IP
return ipinfo
if __name__ == "__main__":
# 生成随机ip的约束条件
ip_seeds = [
"192.168.19.12",
"222.246.135.192/26",
"202.103.64.0-202.103.127.255"
]
ip = random_ipv4(ip_seeds)
print(ip)




