如何修复 Python ipaddress.IPv6Network ValueError: ... has host bits set
问题:
尝试在 Python 中使用类似这样的代码解析 IPv6 网络地址时
ipv6_network_example.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64")你看到类似这样的错误消息
ipv6_traceback.txt
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/tmp/ipykernel_154945/1312927855.py in <module>
1 import ipaddress
----> 2 ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64")
/usr/lib/python3.8/ipaddress.py in __init__(self, address, strict)
2106 if packed & int(self.netmask) != packed:
2107 if strict:
-> 2108 raise ValueError('%s has host bits set' % self)
2109 else:
2110 self.network_address = IPv6Address(packed &
ValueError: 2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64 has host bits set解决方案 1:也许你应该使用 IPv6Address 而不是 IPv6Network
如果你打算解析地址而不关心网络,使用 ipaddress.IPv6Address,但记住需要删除 CIDR 掩码(例如 /64)。你想使用 IPv6Address 还是 IPv6Network 确实取决于你想用它做什么 - 如果你想引用特定主机,你几乎总是想使用 IPv6Address。
ipv6_address_example.py
import ipaddress
ipaddress.IPv6Address("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69")解决方案 2:使用 strict=False 让 IPv6Network 丢弃主机位:
strict=False 基本上忽略此错误
ipv6_strict_example.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00:8ce6:2eff:fe60:cc69/64", strict=False)注意结果将是
ipv6_strict_result.py
IPv6Network('2a01:c23:c0bb:d00::/64')所以主机位中的信息将丢失!
解决方案 3:手动删除主机位
由于主机位无论如何都会被丢弃,你可以直接指定具有正确网络掩码的 IPv6 网络:
ipv6_network_corrected.py
import ipaddress
ipaddress.IPv6Network("2a01:c23:c0bb:d00::/64")Check out similar posts by category:
Networking, Python
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow