Python ipaddress库ip_address()函数无法处理带前缀的IPv6地址
解决ipaddress库处理带前缀IPv6地址的问题
嘿,这个问题我之前也碰到过!其实原因很简单——你搞混了ipaddress.ip_address()和ipaddress.ip_network()这两个函数的用途:
ip_address()是用来处理单个IP地址的,不管是IPv4还是IPv6,只要是不带子网前缀(就是那个/数字部分)的地址,它都能正常识别。比如你提到的1.0.0.0或者2001:12f8:0:17::23,都是单个IP,所以没问题。- 而你手里的
2001:200:e000::/35是带CIDR前缀的网络地址(表示一个子网范围),这种情况得用ip_network()来处理才行。
给你举个实际的代码例子:
import ipaddress # 单个IPv6地址用ip_address() single_ip = ipaddress.ip_address(u"2001:12f8:0:17::23") print(single_ip) # 输出 IPv6Address('2001:12f8:0:17::23') # 带前缀的网络地址用ip_network() network_ip = ipaddress.ip_network(u"2001:200:e000::/35") print(network_ip) # 输出 IPv6Network('2001:200:e000::/35')
另外要注意,如果你的网络地址里有未对齐的主机位(比如不是严格符合子网规则的地址),ip_network()默认会报错,这时候可以加个strict=False参数来忽略这个检查:
# 处理非严格子网地址的情况 network_ip = ipaddress.ip_network(u"2001:200:e000:1::/35", strict=False)
这样就能正常处理带前缀的IPv6地址啦!
内容的提问来源于stack exchange,提问作者Bruna Zamith
相关产品推荐
相关产品推荐

