Python3标准库:ipaddress Internet地址
Posted 爱编程的小灰灰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3标准库:ipaddress Internet地址相关的知识,希望对你有一定的参考价值。
1. ipaddress Internet地址
ipaddress模块提供了处理IPv4和IPv6网络地址的类。这些类支持验证,查找网络上的地址和主机,以及其他常见操作。
1.1 地址
最基本的对象表示网络地址本身。可以向ip_address()传入一个字符串、整数或字节序列来构造一个地址。返回值是一个IPV4Address或IPv6Address实例,这取决于使用什么类型的地址。
import binascii import ipaddress ADDRESSES = [ \'10.9.0.6\', \'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa\', ] for ip in ADDRESSES: addr = ipaddress.ip_address(ip) print(\'{!r}\'.format(addr)) print(\' IP version:\', addr.version) print(\' is private:\', addr.is_private) print(\' packed form:\', binascii.hexlify(addr.packed)) print(\' integer:\', int(addr)) print()
这两个类可以提供地址的不同表示以满足不同的用途,还可以回答一些基本断言,如这个地址是否为组播通信保留,或者它是否在一个专用网(private network)中。
1.2 网络
网络由一个地址范围定义。通常用一个基本地址和一个掩码表示,掩码指示地址的哪些部分表示网络,哪些部分表示该网络上的地址。可以显式表示掩码,也可以使用一个前缀长度值来表示,如下例所示。
import ipaddress NETWORKS = [ \'10.9.0.0/24\', \'fdfd:87b5:b475:5e3e::/64\', ] for n in NETWORKS: net = ipaddress.ip_network(n) print(\'{!r}\'.format(net)) print(\' is private:\', net.is_private) print(\' broadcast:\', net.broadcast_address) print(\' compressed:\', net.compressed) print(\' with netmask:\', net.with_netmask) print(\' with hostmask:\', net.with_hostmask) print(\' num addresses:\', net.num_addresses) print()
与地址一样,对应IPv4和IPv6网络分别有两个网络类。每个类都提供了一些属性或方法来访问与网络相关的值,如广播地址和主机可以使用的网络地址。
网络实例是可迭代的,会提供网络上的地址。
import ipaddress NETWORKS = [ \'10.9.0.0/24\', \'fdfd:87b5:b475:5e3e::/64\', ] for n in NETWORKS: net = ipaddress.ip_network(n) print(\'{!r}\'.format(net)) for i, ip in zip(range(3), net): print(ip) print()
这个例子只打印了部分地址,因为IPv6网络可能包含太多的地址,无法在这里全部输出。
迭代处理网络会提供地址,不过并不是所有这些地址都能作为主机的合法地址。例如,网络的基地址和广播地址也包含在内。要查找能够由网络上常规主机使用的地址,可以使用hosts()方法,它会生成一个生成器。
import ipaddress NETWORKS = [ \'10.9.0.0/24\', \'fdfd:87b5:b475:5e3e::/64\', ] for n in NETWORKS: net = ipaddress.ip_network(n) print(\'{!r}\'.format(net)) for i, ip in zip(range(3), net.hosts()): print(ip) print()
将这个例子的输出与前一个例子进行比较,可以看到,主机地址中不包含迭代处理整个网络时生成的前几个值。
除了迭代器协议,网络还支持in操作符,可以用来确定一个地址是否是一个网络的一部分。
import ipaddress NETWORKS = [ ipaddress.ip_network(\'10.9.0.0/24\'), ipaddress.ip_network(\'fdfd:87b5:b475:5e3e::/64\'), ] ADDRESSES = [ ipaddress.ip_address(\'10.9.0.6\'), ipaddress.ip_address(\'10.7.0.31\'), ipaddress.ip_address( \'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa\' ), ipaddress.ip_address(\'fe80::3840:c439:b25e:63b0\'), ] for ip in ADDRESSES: for net in NETWORKS: if ip in net: print(\'{}\\nis on {}\'.format(ip, net)) break else: print(\'{}\\nis not on a known network\'.format(ip)) print()
in的实现使用网络掩码来测试地址,所以这比展开网络上的完整地址列表要高效得多。
1.3 接口
网络接口表示网络上的一个特定地址,可以表示为一个主机地址和一个网络前缀或网络掩码。
import ipaddress ADDRESSES = [ \'10.9.0.6/24\', \'fdfd:87b5:b475:5e3e:b1bc:e121:a8eb:14aa/64\', ] for ip in ADDRESSES: iface = ipaddress.ip_interface(ip) print(\'{!r}\'.format(iface)) print(\'network:\\n \', iface.network) print(\'ip:\\n \', iface.ip) print(\'IP with prefixlen:\\n \', iface.with_prefixlen) print(\'netmask:\\n \', iface.with_netmask) print(\'hostmask:\\n \', iface.with_hostmask) print()
接口对象包含一些属性,可以分别访问完整的网络和地址,另外提供了多种不同方法来表示接口和网络掩码。
以上是关于Python3标准库:ipaddress Internet地址的主要内容,如果未能解决你的问题,请参考以下文章