python中是否有办法从给定的起始网络地址获取下一个网络地址。有很多方法可以使用ipaddress
模块获取下一个主机IP,但有没有办法获得下一个网络?
例如,如果我的起始网络地址为10.1.0.0/16
,那么在每次迭代时,我希望将下一个网络地址设为10.2.0.0/16
,10.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')
尝试使用子网选项,但顾名思义,它将为您提供当前网络中的子网络
In [34]: network = ipaddress.ip_network('10.1.0.0/16')
In [35]: network.subnets()
但我们的要求是获取下一个网络地址(最好没有任何字符串操作)
答案 0 :(得分:2)
库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())
测试代码:
print(next(network_addrs))
print(next(network_addrs))
print(next(network_addrs))
<强>结果:强>
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())
Python 3.4:
Python 3.4不接受init 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