📅  最后修改于: 2023-12-03 14:51:54.467000             🧑  作者: Mango
ipaddress
模块是 Python 3.3 新增的内置模块,提供了 IP 地址操作的功能。这个模块可以代替过时的 socket
模块中操作 IP 地址的方法,提供了更为简单和直观的解决方案。
ipaddress
模块中包含了多个类和函数,可以用于创建、操作和验证 IPv4 和 IPv6 地址、网络和接口。接下来,我们将介绍 ipaddress
模块的主要用法。
ipaddress
模块是 Python 3.3 新增的内置模块,不需要额外安装。
我们可以使用 ipaddress.IPv4Address()
或 ipaddress.IPv6Address()
函数来创建 IPv4 或 IPv6 地址对象。这两个函数接受一个字符串类型的 IP 地址作为参数,并返回一个 IP 地址对象。
import ipaddress
# 创建 IPv4 地址对象
ip = ipaddress.IPv4Address('192.0.2.1')
print(ip) # 192.0.2.1
# 创建 IPv6 地址对象
ip = ipaddress.IPv6Address('2001:0db8::1')
print(ip) # 2001:db8::1
我们也可以使用 ipaddress.ip_address()
函数来自动判断传入的字符串是 IPv4 还是 IPv6 地址,并返回相应的 IP 地址对象。
import ipaddress
# 自动判断 IP 类型
ip = ipaddress.ip_address('192.0.2.1')
print(ip) # 192.0.2.1
ip = ipaddress.ip_address('2001:0db8::1')
print(ip) # 2001:db8::1
我们可以使用 ipaddress.IPv4Network()
或 ipaddress.IPv6Network()
函数来创建 IPv4 或 IPv6 网络对象。这两个函数接受一个字符串类型的 IP 地址和子网掩码作为参数,并返回一个网络对象。
import ipaddress
# 创建 IPv4 网络对象
net = ipaddress.IPv4Network('192.0.2.0/24')
print(net) # 192.0.2.0/24
# 创建 IPv6 网络对象
net = ipaddress.IPv6Network('2001:db8::/32')
print(net) # 2001:db8::/32
我们也可以使用 ipaddress.ip_network()
函数来自动判断传入的字符串是 IPv4 还是 IPv6 地址,并返回相应的网络对象。
import ipaddress
# 自动判断网络类型
net = ipaddress.ip_network('192.0.2.0/24')
print(net) # 192.0.2.0/24
net = ipaddress.ip_network('2001:db8::/32')
print(net) # 2001:db8::/32
我们可以使用 ipaddress.IPv4Interface()
或 ipaddress.IPv6Interface()
函数来创建 IPv4 或 IPv6 接口对象。这两个函数接受一个字符串类型的 IP 地址和子网掩码作为参数,并返回一个接口对象。
import ipaddress
# 创建 IPv4 接口对象
intf = ipaddress.IPv4Interface('192.0.2.1/24')
print(intf) # 192.0.2.1/24
# 创建 IPv6 接口对象
intf = ipaddress.IPv6Interface('2001:db8::1/64')
print(intf) # 2001:db8::1/64
我们也可以使用 ipaddress.ip_interface()
函数来自动判断传入的字符串是 IPv4 还是 IPv6 地址,并返回相应的接口对象。
import ipaddress
# 自动判断接口类型
intf = ipaddress.ip_interface('192.0.2.1/24')
print(intf) # 192.0.2.1/24
intf = ipaddress.ip_interface('2001:db8::1/64')
print(intf) # 2001:db8::1/64
ipaddress
模块提供了许多方法来操作 IP 地址、网络和接口对象。
import ipaddress
# 创建 IPv4 网络对象
net = ipaddress.IPv4Network('192.0.2.0/24')
# 获取网络地址和广播地址
print(net.network_address) # 192.0.2.0
print(net.broadcast_address) # 192.0.2.255
# 遍历网络中的所有主机
for ip in net.hosts():
print(ip)
# 判断 IP 地址是否在网络中
ip = ipaddress.IPv4Address('192.0.2.1')
print(ip in net) # True
# 获取子网掩码长度和子网掩码
print(net.prefixlen) # 24
print(net.netmask) # 255.255.255.0
ipaddress
模块中的 ip_address()
函数可以验证一个字符串是否是有效的 IP 地址。如果是有效的,则返回相应的 IP 地址对象;如果是无效的,则抛出 ValueError
异常。
import ipaddress
# 验证 IPv4 地址
ip = ipaddress.ip_address('192.0.2.1')
print(ip) # 192.0.2.1
# 验证 IPv6 地址
ip = ipaddress.ip_address('2001:db8::1')
print(ip) # 2001:db8::1
# 验证无效地址
try:
ip = ipaddress.ip_address('192.0.2')
except ValueError as e:
print(e) # Address 192.0.2 has a missing or invalid component
ipaddress
模块中的 ip_network()
函数可以验证一个字符串是否是有效的网络地址。如果是有效的,则返回相应的网络对象;如果是无效的,则抛出 ValueError
异常。
import ipaddress
# 验证 IPv4 网络
net = ipaddress.ip_network('192.0.2.0/24')
print(net) # 192.0.2.0/24
# 验证 IPv6 网络
net = ipaddress.ip_network('2001:db8::/32')
print(net) # 2001:db8::/32
# 验证无效网络
try:
net = ipaddress.ip_network('192.0.2')
except ValueError as e:
print(e) # '192.0.2' does not appear to be an IPv4 or IPv6 network
ipaddress
模块中的 ip_interface()
函数可以验证一个字符串是否是有效的接口地址。如果是有效的,则返回相应的接口对象;如果是无效的,则抛出 ValueError
异常。
import ipaddress
# 验证 IPv4 接口
intf = ipaddress.ip_interface('192.0.2.1/24')
print(intf) # 192.0.2.1/24
# 验证 IPv6 接口
intf = ipaddress.ip_interface('2001:db8::1/64')
print(intf) # 2001:db8::1/64
# 验证无效接口
try:
intf = ipaddress.ip_interface('192.0.2')
except ValueError as e:
print(e) # '192.0.2' does not appear to be an IPv4 or IPv6 interface
ipaddress
模块提供了简单、直观、灵活的 IP 地址操作方式,可以方便地创建、操作和验证 IP 地址、网络和接口。在实际开发中,我们可以根据具体需求来使用 ipaddress
模块,并充分利用它提供的方法和属性。