📜  如何使用 ipaddress 模块在Python中操作 IP 地址?(1)

📅  最后修改于: 2023-12-03 14:51:54.467000             🧑  作者: Mango

如何使用 ipaddress 模块在Python中操作 IP 地址?

简介

ipaddress 模块是 Python 3.3 新增的内置模块,提供了 IP 地址操作的功能。这个模块可以代替过时的 socket 模块中操作 IP 地址的方法,提供了更为简单和直观的解决方案。

ipaddress 模块中包含了多个类和函数,可以用于创建、操作和验证 IPv4 和 IPv6 地址、网络和接口。接下来,我们将介绍 ipaddress 模块的主要用法。

安装

ipaddress 模块是 Python 3.3 新增的内置模块,不需要额外安装。

创建 IP 地址对象

我们可以使用 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
IP 地址操作

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
验证 IP 地址

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 模块,并充分利用它提供的方法和属性。