如何修复 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