图书馆ipcalc https://pypi.python.org/pypi/ipcalc有一些例程可以使 IP 地址的数学计算变得相当容易。作为示例,可以使用迭代器来获取下一个网络范围地址:
Code:
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))
Results:
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
Usage:
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 不接受元组来初始化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