Python 如何从当前网络地址递增并获取下一个IPv6网络地址

Python 如何从当前网络地址递增并获取下一个IPv6网络地址,python,networking,ipv6,Python,Networking,Ipv6,使用标准python包,如果我们将任何IPv6网络地址作为输入,如何获取接下来的几个IPv6网络地址。基本上,我想迭代给定的网络地址,每次迭代时,它应该递增并得到下一个网络地址 例如,如果我的起始网络地址为4001:1::/32,则在每次迭代中,我希望获得下一个网络地址为4001:2::/32、4001:3::/32、4001:4::/32,依此类推 >>> inet = iterate_on('4001:1::/32') >>> next(inet) 400

使用标准python包,如果我们将任何IPv6网络地址作为输入,如何获取接下来的几个IPv6网络地址。基本上,我想迭代给定的网络地址,每次迭代时,它应该递增并得到下一个网络地址

例如,如果我的起始网络地址为4001:1::/32,则在每次迭代中,我希望获得下一个网络地址为4001:2::/32、4001:3::/32、4001:4::/32,依此类推

>>> inet = iterate_on('4001:1::/32')
>>> next(inet)
4001:2::/32
>>> next(inet)
4001:3::/32
注意:这是我的上一个问题。

该库有一些例程,可以使ip地址的计算变得相当简单。但如果最好不要安装ipcalc,则可以构造一个从ipaddress.IPv6Network继承的类

代码 结果: Python 3.4: Python 3.4不接受init ipaddress.IPv6Network的元组。这段代码将解决这个问题

import ipaddress

class BetterIPv6Network(ipaddress.IPv6Network):

    def __add__(self, offset):
        """Add numeric offset to the IP."""
        new_base_addr = int(self.network_address) + offset
        new_base_addr_str = str(self.__class__(new_base_addr)).split('/')[0]
        return self.__class__(
            new_base_addr_str + '/' + str(self).split('/')[1])

    def size(self):
        """Return network size."""
        return 1 << (self.max_prefixlen - self.prefixlen)
导入IP地址
类别BetterIPV6网络(ipaddress.IPv6Network):
定义添加(自,偏移):
“”“将数字偏移量添加到IP。”“”
新地址=整数(自网络地址)+偏移量
new_base_addr_str=str(self.u class_uu(new_base_addr)).split('/')[0]
返回自我__(
新的地址str+'/'+str(self.split('/')[1])
def大小(自身):
“”“返回网络大小。”“”
返回1
import itertools as it
network = BetterIPv6Network(u'4001:1::/32')
network_addrs = (network + i * network.size() for i in it.count())
print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))
4001:1::/32
4001:2::/32
4001:3::/32
import ipaddress

class BetterIPv6Network(ipaddress.IPv6Network):

    def __add__(self, offset):
        """Add numeric offset to the IP."""
        new_base_addr = int(self.network_address) + offset
        new_base_addr_str = str(self.__class__(new_base_addr)).split('/')[0]
        return self.__class__(
            new_base_addr_str + '/' + str(self).split('/')[1])

    def size(self):
        """Return network size."""
        return 1 << (self.max_prefixlen - self.prefixlen)