>>> ipaddress.ip_address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.ip_address('2001:db8::')
IPv6Address('2001:db8::')
ipaddress.
ip_network
(address, strict=True)
返回一个 IPv4Network
或 IPv6Network
对象,具体取决于作为参数传入的 IP 地址。 address 是表示 IP 网址的字符串或整数。 可以提供 IPv4 或 IPv6 网址;小于 2**32 的整数默认被视为 IPv4。 strict 会被传给 IPv4Network
或 IPv6Network
构造器。 如果 address 不表示有效的 IPv4 或 IPv6 网址,或者网络设置了 host 比特位,则会引发 ValueError
。
>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
ipaddress.
ip_interface
(address)
返回一个 IPv4Interface
或 IPv6Interface
对象,取决于作为参数传递的 IP 地址。 address 是代表 IP 地址的字符串或整数。 可以提供 IPv4 或 IPv6 地址,小于 2**32 的整数默认认为是 IPv4。 如果 address 不是有效的IPv4 或 IPv6 地址,则会抛出一个 ValueError
。
这些方便的函数的一个缺点是需要同时处理IPv4和IPv6格式,这意味着提供的错误信息并不精准,因为函数不知道是打算采用IPv4还是IPv6格式。更详细的错误报告可以通过直接调用相应版本的类构造函数来获得。
21.28.2. IP 地址
21.28.2.1. 地址对象
IPv4Address
和 IPv6Address
对象有很多共同的属性。一些只对IPv6 地址有意义的属性也在 IPv4Address
对象实现,以便更容易编写正确处理两种 IP 版本的代码。地址对象是可哈希的 hashable,所以它们可以作为字典中的键来使用。
class ipaddress.
IPv4Address
(address)
构造一个 IPv4 地址。 如果 address 不是一个有效的 IPv4 地址,会抛出 AddressValueError
。
以下是有效的 IPv4 地址:
以十进制小数点表示的字符串,由四个十进制整数组成,范围为0–255,用点隔开(例如 192.168.0.1
)。每个整数代表地址中的八位(一个字节)。只有对于小于8的值,才允许使用前导零(因为对这种字符串的十进制和八进制解释之间没有任何歧义)。
一个32位可容纳的整数。
一个长度为 4 的封装在 bytes
对象中的整数(高位优先)。
>>> ipaddress.IPv4Address('192.168.0.1')
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
>>> ipaddress.IPv4Address(b'\xC0\xA8\x00\x01')
IPv4Address('192.168.0.1')
reverse_pointer
IP地址的反向DNS PTR记录的名称,例如:
>>> ipaddress.ip_address("127.0.0.1").reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> ipaddress.ip_address("2001:db8::1").reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa'
这是可用于执行PTR查询的名称,而不是已解析的主机名本身。
3.5 新版功能.
is_global
如果该地址被分配至公共网络,返回 True
。关于公共网络,请参见 iana-ipv4-special-registry (针对IPv4)和 iana-ipv6-special-registry (针对IPv6)。
3.4 新版功能.
class ipaddress.
IPv6Address
(address)
构造一个 IPv6 地址。 如果 address 不是一个有效的 IPv6 地址,会抛出 AddressValueError
。
以下是有效的 IPv6 地址:
一个由八组四个16进制数字组成的字符串, 每组展示为16位. 以冒号分隔. 这可以描述为 分解 (普通书写). 此字符可以被 压缩 (速记书写) . 详见:RFC:4291 . 例如, "0000:0000:0000:0000:0000:0abc:0007:0def"
可以被精简为 "::abc:7:def"
.
适合 128 位的整数.
一个打包在长度为 16 字节的大端序 bytes
对象中的整数。
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
地址的长形式表示,包括所有前导零和完全由零组成的组。
For the following attributes, see the corresponding documentation of the
IPv4Address
class:
packed
21.28.2.2. 转换字符串和整数
与网络模块互操作像套接字模块, 地址必须转换为字符串或整数. 这是使用 str()
和 int()
内置函数:
>>> str(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> int(ipaddress.IPv4Address('192.168.0.1'))
3232235521
>>> str(ipaddress.IPv6Address('::1'))
'::1'
>>> int(ipaddress.IPv6Address('::1'))
21.28.2.3.1. 比较运算符
Address objects can be compared with the usual set of comparison operators. Some
examples:
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
False
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
>>> IPv4Address('127.0.0.2') + 3
IPv4Address('127.0.0.5')
>>> IPv4Address('127.0.0.2') - 3
IPv4Address('126.255.255.255')
>>> IPv4Address('255.255.255.255') + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ipaddress.AddressValueError: 4294967296 (>= 2**32) is not permitted as an IPv4 address
21.28.3. IP网络的定义
IPv4Network
和 IPv6Network
对象提供了一个定义和检查IP网络定义的机制。一个网络定义由一个 掩码 和一个 网络地址 组成,因此定义了一个IP地址的范围,当用掩码屏蔽(二进制AND)时,等于网络地址。 例如,一个带有掩码``255.255.255.0``和网络地址``192.168.1.0``的网络定义由包括``192.168.1.0``到``192.168.1.255``的IP地址组成。
21.28.3.1. 前缀、网络掩码和主机掩码
有几种相等的方法来指定IP网络掩码。 前缀 /<nbits>``是一个符号,表示在网络掩码中设置了多少个高阶位。 一个 *网络掩码* 是一个设置了一定数量高阶位的IP地址。 因此,前缀
/24``等同于IPv4中的网络掩码``255.255.255.0``或IPv6中的网络掩码``ffff:ff00::。 此外,*主机掩码* 是 *网络掩码* 的逻辑取反,有时被用来表示网络掩码(例如在Cisco访问控制列表中)。 在IPv4中,相当于主机掩码``0.0.0.255``的是
/24`` 。
21.28.3.2. 网络对象
所有由地址对象实现的属性也由网络对象实现。 此外,网络对象还实现了额外的属性。所有这些在 IPv4Network
和 IPv6Network
之间是共同的,所以为了避免重复,它们只在 IPv4Network
中记录。网络对象是 hashable,所以它们可以作为字典中的键使用。
class ipaddress.
IPv4Network
(address, strict=True)
构建一个 IPv4 网络定义。 address 可以是以下之一:
一个由 IP 地址和可选掩码组成的字符串,用斜线 (/
) 分开。 IP 地址是网络地址,掩码可以是一个单一的数字,这意味着它是一个 前缀,或者是一个 IPv4 地址的字符串表示。 如果是后者,如果掩码以非零字段开始,则被解释为 网络掩码,如果以零字段开始,则被解释为 主机掩码,唯一的例外是全零的掩码被视为 网络掩码。 如果没有提供掩码,它就被认为是 /32
。
例如,以下的*地址*描述是等同的:192.168.1.0/24
,192.168.1.0/255.255.255.0``和``192.168.1.0/0.0.0.255
一个可转化为32位的整数。 这相当于一个单地址的网络,网络地址是*address*,掩码是``/32``。
一个整数被打包成一个长度为 4 的大端序 bytes
对象。 其解释类似于一个整数 address。
一个地址描述和一个网络掩码的双元组,其中地址描述是一个字符串,一个 32 位的整数,一个 4 字节的打包整数,或一个现有的 IPv4Address 对象;而网络掩码是一个代表前缀长度的整数 (例如 24
) 或一个代表前缀掩码的字符串 (例如 255.255.255.0
)。
如果 address 不是一个有效的 IPv4 地址则会引发 AddressValueError
。 如果掩码不是有效的 IPv4 地址则会引发 NetmaskValueError
。
如果 strict 是 True
,并且在提供的地址中设置了主机位,那么 ValueError
将被触发。 否则,主机位将被屏蔽掉,以确定适当的网络地址。
除非另有说明,如果参数的 IP 版本与 self
不兼容,所有接受其他网络/地址对象的网络方法都将引发 TypeError
。
在 3.5 版更改: 为*address*构造函数参数添加了双元组形式。
version
hosts
()
Returns an iterator over the usable hosts in the network. The usable
hosts are all the IP addresses that belong to the network, except the
network address itself and the network broadcast address. For networks
with a mask length of 31, the network address and network broadcast
address are also included in the result.
>>> list(ip_network('192.0.2.0/29').hosts())
[IPv4Address('192.0.2.1'), IPv4Address('192.0.2.2'),
IPv4Address('192.0.2.3'), IPv4Address('192.0.2.4'),
IPv4Address('192.0.2.5'), IPv4Address('192.0.2.6')]
>>> list(ip_network('192.0.2.0/31').hosts())
[IPv4Address('192.0.2.0'), IPv4Address('192.0.2.1')]
address_exclude
(network)
计算从这个网络中移除给定的 network 后产生的网络定义。 返回一个网络对象的迭代器。 如果 network 不完全包含在这个网络中则会引发 ValueError
。
>>> n1 = ip_network('192.0.2.0/28')
>>> n2 = ip_network('192.0.2.1/32')
>>> list(n1.address_exclude(n2))
[IPv4Network('192.0.2.8/29'), IPv4Network('192.0.2.4/30'),
IPv4Network('192.0.2.2/31'), IPv4Network('192.0.2.0/32')]
subnets
(prefixlen_diff=1, new_prefix=None)
根据参数值,加入的子网构成当前的网络定义。 prefixlen_diff 是我们的前缀长度应该增加的数量。 new_prefix 是所需的子网的新前缀;它必须大于我们的前缀。 必须设置 prefixlen_diff 和 new_prefix 中的一个,且只有一个。 返回一个网络对象的迭代器。
>>> list(ip_network('192.0.2.0/24').subnets())
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
>>> list(ip_network('192.0.2.0/24').subnets(prefixlen_diff=2))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=26))
[IPv4Network('192.0.2.0/26'), IPv4Network('192.0.2.64/26'),
IPv4Network('192.0.2.128/26'), IPv4Network('192.0.2.192/26')]
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=23))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
raise ValueError('new prefix must be longer')
ValueError: new prefix must be longer
>>> list(ip_network('192.0.2.0/24').subnets(new_prefix=25))
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]
supernet
(prefixlen_diff=1, new_prefix=None)
包含这个网络定义的超级网,取决于参数值。 prefixlen_diff 是我们的前缀长度应该减少的数量。 new_prefix 是超级网的新前缀;它必须比我们的前缀小。 必须设置 prefixlen_diff 和 new_prefix 中的一个,而且只有一个。 返回一个单一的网络对象。
>>> ip_network('192.0.2.0/24').supernet()
IPv4Network('192.0.2.0/23')
>>> ip_network('192.0.2.0/24').supernet(prefixlen_diff=2)
IPv4Network('192.0.0.0/22')
>>> ip_network('192.0.2.0/24').supernet(new_prefix=20)
IPv4Network('192.0.0.0/20')
compare_networks
(other)
将这个网络与*ohter*网络进行比较。 在这个比较中,只考虑网络地址;不考虑主机位。 返回是``-1`` 、 0``或``1
。
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
构建一个 IPv6 网络定义。 address 可以是以下之一:
一个由IP地址和可选前缀长度组成的字符串,用斜线(/
)分开。 IP地址是网络地址,前缀长度必须是一个数字,即*prefix*。 如果没有提供前缀长度,就认为是``/128``。
请注意,目前不支持扩展的网络掩码。 这意味着 2001:db00::0/24
是一个有效的参数,而 2001:db00::0/ffff:ff00::
不是。
一个适合128位的整数。 这相当于一个单地址网络,网络地址是*address*,掩码是``/128``。
一个整数被打包成一个长度为 16 的大端序 bytes
对象。 其解释类似于一个整数的 address。
一个地址描述和一个网络掩码的双元组,其中地址描述是一个字符串,一个 128 位的整数,一个 16 字节的打包整数,或者一个现有的 IPv6Address 对象;而网络掩码是一个代表前缀长度的整数。
如果 address 不是一个有效的 IPv6 地址则会引发 AddressValueError
。 如果掩码对 IPv6 地址无效则会引发 NetmaskValueError
。
如果 strict 是 True
,并且在提供的地址中设置了主机位,那么 ValueError
将被触发。 否则,主机位将被屏蔽掉,以确定适当的网络地址。
在 3.5 版更改: 为*address*构造函数参数添加了双元组形式。
version
hosts
()
Returns an iterator over the usable hosts in the network. The usable
hosts are all the IP addresses that belong to the network, except the
Subnet-Router anycast address. For networks with a mask length of 127,
the Subnet-Router anycast address is also included in the result.
21.28.3.3.2. 迭代
网络对象可以被迭代,以列出属于该网络的所有地址。 对于迭代,所有 主机都会被返回,包括不可用的主机(对于可用的主机,使用 hosts()
方法)。 一个例子:
>>> for addr in IPv4Network('192.0.2.0/28'):
... addr
IPv4Address('192.0.2.0')
IPv4Address('192.0.2.1')
IPv4Address('192.0.2.2')
IPv4Address('192.0.2.3')
IPv4Address('192.0.2.4')
IPv4Address('192.0.2.5')
IPv4Address('192.0.2.6')
IPv4Address('192.0.2.7')
IPv4Address('192.0.2.8')
IPv4Address('192.0.2.9')
IPv4Address('192.0.2.10')
IPv4Address('192.0.2.11')
IPv4Address('192.0.2.12')
IPv4Address('192.0.2.13')
IPv4Address('192.0.2.14')
IPv4Address('192.0.2.15')
>>> IPv4Network('192.0.2.0/28')[0]
IPv4Address('192.0.2.0')
>>> IPv4Network('192.0.2.0/28')[15]
IPv4Address('192.0.2.15')
>>> IPv4Address('192.0.2.6') in IPv4Network('192.0.2.0/28')
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
False
class ipaddress.
IPv4Interface
(address)
构建一个 IPv4 接口。 address 的含义与 IPv4Network
构造器中的一样,不同之处在于任意主机地址总是会被接受。
IPv4Interface
是 IPv4Address
的一个子类,所以它继承了该类的所有属性。 此外,还有以下属性可用:
地址(IPv4Address
)没有网络信息。
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.ip
IPv4Address('192.0.2.5')
该接口所属的网络(IPv4Network
)。
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.network
IPv4Network('192.0.2.0/24')
用前缀符号表示的接口与掩码的字符串。
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_prefixlen
'192.0.2.5/24'
class ipaddress.
IPv6Interface
(address)
构建一个 IPv6 接口。 address 的含义与 IPv6Network
构造器中的一样,不同之处在于任意主机地址总是会被接受。
IPv6Interface
是 IPv6Address
的一个子类,所以它继承了该类的所有属性。 此外,还有以下属性可用:
21.28.4.1.1. 逻辑操作符
接口对象可以用通常的逻辑运算符集进行比较。
对于相等比较(==``和
!=``),IP地址和网络都必须是相同的对象才会相等。 一个接口不会与任何地址或网络对象相等。
对于排序 (<
、>
等),规则是不同的。 具有相同 IP 版本的接口和地址对象可以被比较,而地址对象总是在接口对象之前排序。 两个接口对象首先通过它们的网络进行比较,如果它们是相同的,则通过它们的 IP 地址进行比较。
ipaddress.
v4_int_to_packed
(address)
以网络(大端序)顺序将一个地址表示为 4 个打包的字节。address 是一个 IPv4 IP 地址的整数表示。 如果整数是负数或太大而不满足 IPv4 IP 地址要求,会触发一个 ValueError
。
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.v4_int_to_packed(3221225985)
b'\xc0\x00\x02\x01'
ipaddress.
summarize_address_range
(first, last)
给出第一个和最后一个 IP 地址,返回总结的网络范围的迭代器。 first 是范围内的第一个 IPv4Address
或 IPv6Address
,last 是范围内的最后一个 IPv4Address
或 IPv6Address
。 如果 first 或 last 不是IP地址或不是同一版本则会引发 TypeError
。 如果 last 不大于 first,或者 first 的地址版本不是 4 或 6 则会引发 ValueError
。
>>> [ipaddr for ipaddr in ipaddress.summarize_address_range(
... ipaddress.IPv4Address('192.0.2.0'),
... ipaddress.IPv4Address('192.0.2.130'))]
[IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')]
ipaddress.
collapse_addresses
(addresses)
返回一个 IPv4Network
或 IPv6Network
对象的迭代器。 addresses 是一个 IPv4Network
或 IPv6Network
对象的迭代器。 如果 addresses 包含混合版本的对象则会引发 TypeError
。
>>> [ipaddr for ipaddr in
... ipaddress.collapse_addresses([ipaddress.IPv4Network('192.0.2.0/25'),
... ipaddress.IPv4Network('192.0.2.128/25')])]
[IPv4Network('192.0.2.0/24')]
ipaddress.
get_mixed_type_key
(obj)
返回一个适合在网络和地址之间进行排序的键。 地址和网络对象在默认情况下是不可排序的;它们在本质上是不同的,所以表达式:
IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')
是没有意义的。 然而,有些时候,你可能希望让 ipaddress
对这些进行排序。 如果你需要这样做,你可以使用这个函数作为 sorted()
的 key 参数。
obj 是一个网络或地址对象。