在python中,如何获得给定起始网络地址的下一个网络地址

2024-04-24 16:18:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中有没有一种方法可以从给定的起始网络地址中获取下一个网络地址。使用ipaddress模块可以获得下一个主机IP,但是有没有办法获得下一个网络本身?在

例如,如果我的起始网络地址10.1.0.0/16,那么在每次迭代中,我都希望得到下一个网络地址10.2.0.0/1610.3.0.0/16等等。在

因此,在10.1.0.0/16的情况下,网络部分是前两个八位字节(10.1),其余部分是主机部分。我希望在每次迭代中单独增加网络部分,保持主机部分不变,例如:

start_network = ipaddress.ip_network('10.1.0.0/16')

# Now on each iteration I want the below output

In [37]: next(start_network)
Out[37]: IPv4Network('10.2.0.0/16')
In [38]: next(start_network)
Out[38]: IPv4Network('10.3.0.0/16')

尝试使用子网选项,但顾名思义,它将为您提供当前网络中的子网络

^{pr2}$

但我们的要求是获得下一个网络地址(最好不进行任何字符串操作)


Tags: 模块方法inip网络情况networkout
1条回答
网友
1楼 · 发布于 2024-04-24 16:18:04

ipcalc有一些例程可以使计算ip地址相当容易。例如,获取下一个网络范围地址的迭代器可以如下操作:

代码:

import ipcalc
import itertools as it

network = ipcalc.Network('10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

测试代码:

^{pr2}$

结果:

10.2.0.0/16
10.3.0.0/16
10.4.0.0/16

仅标准库:

如果不安装ipcalc,那么可以构造继承自ipaddress.IPv4Network的类。在

import ipaddress

class BetterIPv4Network(ipaddress.IPv4Network):

    def __add__(self, offset):
        """Add numeric offset to the IP."""
        new_base_addr = int(self.network_address) + offset
        return self.__class__((new_base_addr, str(self.netmask)))

    def size(self):
        """Return network size."""
        start = int(self.network_address)
        return int(self.broadcast_address) + 1 - start

用法:

import itertools as it

network = BetterIPv4Network(u'10.1.0.0/16')
network_addrs = (network + (i + 1) * network.size() for i in it.count())

Python3.4:

Python3.4不接受初始化ipaddress.IPv4Network的元组。这个代码可以解决这个问题。在

class BetterIPv4Network(ipaddress.IPv4Network):

    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.netmask))

    def size(self):
        """Return network size."""
        start = int(self.network_address)
        return int(self.broadcast_address) + 1 - start

相关问题 更多 >