ipaddress --- IPv4/IPv6 操作庫?

源代碼: Lib/ipaddress.py


ipaddress 提供了創(chuàng)建、處理和操作 IPv4 和 IPv6 地址和網(wǎng)絡(luò)的功能。

該模塊中的函數(shù)和類可以直接處理與IP地址相關(guān)的各種任務(wù),包括檢查兩個主機(jī)是否在同一個子網(wǎng)中,遍歷某個子網(wǎng)中的所有主機(jī),檢查一個字符串是否是一個有效的IP地址或網(wǎng)絡(luò)定義等等。

這是完整的模塊 API 參考—若要查看概述,請見 ipaddress模塊介紹.

3.3 新版功能.

方便的工廠函數(shù)?

ipaddress 模塊提供來工廠函數(shù)來方便地創(chuàng)建 IP 地址,網(wǎng)絡(luò)和接口:

ipaddress.ip_address(address)?

Return an IPv4Address or IPv6Address object depending on the IP address passed as argument. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. A ValueError is raised if address does not represent a valid IPv4 or IPv6 address.

>>>
>>> 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)?

Return an IPv4Network or IPv6Network object depending on the IP address passed as argument. address is a string or integer representing the IP network. Either IPv4 or IPv6 networks may be supplied; integers less than 2**32 will be considered to be IPv4 by default. strict is passed to IPv4Network or IPv6Network constructor. A ValueError is raised if address does not represent a valid IPv4 or IPv6 address, or if the network has host bits set.

>>>
>>> ipaddress.ip_network('192.168.0.0/28')
IPv4Network('192.168.0.0/28')
ipaddress.ip_interface(address)?

Return an IPv4Interface or IPv6Interface object depending on the IP address passed as argument. address is a string or integer representing the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. A ValueError is raised if address does not represent a valid IPv4 or IPv6 address.

這些方便的函數(shù)的一個缺點(diǎn)是需要同時處理IPv4和IPv6格式,這意味著提供的錯誤信息并不精準(zhǔn),因?yàn)楹瘮?shù)不知道是打算采用IPv4還是IPv6格式。更詳細(xì)的錯誤報告可以通過直接調(diào)用相應(yīng)版本的類構(gòu)造函數(shù)來獲得。

IP 地址?

地址對象?

IPv4AddressIPv6Address 對象有很多共同的屬性。一些只對IPv6 地址有意義的屬性也在 IPv4Address 對象實(shí)現(xiàn),以便更容易編寫正確處理兩種 IP 版本的代碼。地址對象是可哈希的 hashable,所以它們可以作為字典中的鍵來使用。

class ipaddress.IPv4Address(address)?

構(gòu)造一個 IPv4 地址。 如果 address 不是一個有效的 IPv4 地址,會拋出 AddressValueError 。

以下是有效的 IPv4 地址:

  1. 以十進(jìn)制小數(shù)點(diǎn)表示的字符串,由四個十進(jìn)制整數(shù)組成,范圍為0--255,用點(diǎn)隔開(例如 192.168.0.1 )。每個整數(shù)代表地址中的八位(一個字節(jié))。不允許使用前導(dǎo)零,以免與八進(jìn)制表示產(chǎn)生歧義。

  2. 一個32位可容納的整數(shù)。

  3. 一個長度為 4 的封裝在 bytes 對象中的整數(shù)(高位優(yōu)先)。

>>>
>>> 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')

在 3.8 版更改: 前導(dǎo)零可被接受,即使是在可能與八進(jìn)制表示混淆的情況下也會被接受。

在 3.10 版更改: 前導(dǎo)零不再被接受,并且會被視作錯誤。IPv4地址字符串現(xiàn)在嚴(yán)格按照glibc的 inet_pton() 函數(shù)進(jìn)行解析。

在 3.9.5 版更改: 上述變更也在自3.9.5版本起的Python 3.9當(dāng)中被包含。

在 3.8.12 版更改: 從3.8.12版本開始,Python 3.8中也包含了上述變化。

version?

合適的版本號:IPv4為 4 ,IPv6為 6 。

max_prefixlen?

在該版本的地址表示中,比特數(shù)的總數(shù):IPv4為 32 ;IPv6為 128 。

前綴定義了地址中的前導(dǎo)位數(shù)量,通過比較來確定一個地址是否是網(wǎng)絡(luò)的一部分。

compressed?
exploded?

以點(diǎn)符號分割十進(jìn)制表示的字符串。表示中不包括前導(dǎo)零。

由于IPv4沒有為八位數(shù)設(shè)為零的地址定義速記符號,這兩個屬性始終與IPv4地址的``str(addr)``相同。暴露這些屬性使得編寫能夠處理IPv4和IPv6地址的顯示代碼變得更加容易。

packed?

這個地址的二進(jìn)制表示——一個適當(dāng)長度的 bytes 對象(最高的八位在最前)。 對于 IPv4 來說是 4 字節(jié),對于 IPv6 來說是 16 字節(jié)。

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'

這是可用于執(zhí)行PTR查詢的名稱,而不是已解析的主機(jī)名本身。

3.5 新版功能.

is_multicast?

如果該地址被保留用作多播用途,返回 True 。關(guān)于多播地址,請參見 RFC 3171 (IPv4)和 RFC 2373 (IPv6)。

is_private?

如果該地址被分配至私有網(wǎng)絡(luò),返回 True 。關(guān)于公共網(wǎng)絡(luò),請參見 iana-ipv4-special-registry (針對IPv4)和 iana-ipv6-special-registry (針對IPv6)。

is_global?

如果該地址被分配至公共網(wǎng)絡(luò),返回 True 。關(guān)于公共網(wǎng)絡(luò),請參見 iana-ipv4-special-registry (針對IPv4)和 iana-ipv6-special-registry (針對IPv6)。

3.4 新版功能.

is_unspecified?

當(dāng)?shù)刂肺粗付〞r為``True`` 。 參見 RFC 5735 (IPv4) 或 RFC 2373 (IPv6).

is_reserved?

如果該地址屬于互聯(lián)網(wǎng)工程任務(wù)組(IETF)所規(guī)定的其他保留地址,返回 True 。

is_loopback?

如果該地址為一個回環(huán)地址,返回 True 。關(guān)于回環(huán)地址,請見 RFC 3330 (IPv4)和 RFC 2373 (IPv6)。

如果該地址被保留用于本地鏈接則為 True。 參見 RFC 3927。

IPv4Address.__format__(fmt)?

返回一個IP地址的字符串表示,由一個明確的格式字符串控制。fmt 可以是以下之一: 's',默認(rèn)選項,相當(dāng)于 str(),'b' 用于零填充的二進(jìn)制字符串,'X' 或者 'x' 用于大寫或小寫的十六進(jìn)制表示,或者 'n' 相當(dāng)于 'b' 用于 IPv4 地址和 'x' 用于 IPv6 地址。 對于二進(jìn)制和十六進(jìn)制表示法,可以使用形式指定器 '#' 和分組選項 '_'。 __format__formatstr.format 和 f 字符串使用。

>>>
>>> format(ipaddress.IPv4Address('192.168.0.1'))
'192.168.0.1'
>>> '{:#b}'.format(ipaddress.IPv4Address('192.168.0.1'))
'0b11000000101010000000000000000001'
>>> f'{ipaddress.IPv6Address("2001:db8::1000"):s}'
'2001:db8::1000'
>>> format(ipaddress.IPv6Address('2001:db8::1000'), '_X')
'2001_0DB8_0000_0000_0000_0000_0000_1000'
>>> '{:#_n}'.format(ipaddress.IPv6Address('2001:db8::1000'))
'0x2001_0db8_0000_0000_0000_0000_0000_1000'

3.9 新版功能.

class ipaddress.IPv6Address(address)?

構(gòu)造一個 IPv6 地址。 如果 address 不是一個有效的 IPv6 地址,會拋出 AddressValueError

以下是有效的 IPv6 地址:

  1. 一個由八組四個16進(jìn)制數(shù)字組成的字符串, 每組展示為16位. 以冒號分隔. 這可以描述為 分解 (普通書寫). 此字符可以被 壓縮 (速記書寫) . 詳見:RFC:4291 . 例如, "0000:0000:0000:0000:0000:0abc:0007:0def" 可以被精簡為 "::abc:7:def".

    可選擇的是,該字符串也可以有一個作用域ID,用后綴``%scope_id``表示。如果存在,作用域ID必須是非空的,并且不能包含``%``。詳見:RFC:4007。例如,fe80::1234%1``可以識別節(jié)點(diǎn)第一條鏈路上的地址``fe80::1234

  2. 適合 128 位的整數(shù).

  3. 一個打包在長度為 16 字節(jié)的大端序 bytes 對象中的整數(shù)。

>>>
>>> ipaddress.IPv6Address('2001:db8::1000')
IPv6Address('2001:db8::1000')
>>> ipaddress.IPv6Address('ff02::5678%1')
IPv6Address('ff02::5678%1')
compressed?

地址表示的簡短形式,省略了組中的前導(dǎo)零,完全由零組成的最長的組序列被折疊成一個空組。

這也是``str(addr)``對IPv6地址返回的值。

exploded?

地址的長形式表示,包括所有前導(dǎo)零和完全由零組成的組。

關(guān)于以下屬性和方法,請參見 IPv4Address 類的相應(yīng)文檔。

packed?
reverse_pointer?
version?
max_prefixlen?
is_multicast?
is_private?
is_global?
is_unspecified?
is_reserved?
is_loopback?

3.4 新版功能: is_global

is_site_local?

如果地址被保留用于本地站點(diǎn)則為 True。 請注意本地站點(diǎn)地址空間已被 RFC 3879 棄用。 請使用 is_private 來檢測此地址是否位于 RFC 4193 所定義的本地唯一地址空間中。

ipv4_mapped?

地址為映射的IPv4地址 (起始為 ::FFFF/96), 此屬性記錄為嵌入IPv4地址. 其他的任何地址, 此屬性為 None.

scope_id?

對于:RFC:4007`定義的作用域地址,此屬性以字符串的形式確定地址所屬的作用域的特定區(qū)域。當(dāng)沒有指定作用域時,該屬性將是``None`。

sixtofour?

對于看起來是6to4的地址(以``2002::/16``開頭),如 RFC 3056 所定義的,此屬性將返回嵌入的IPv4地址。 對于任何其他地址,該屬性將是``None``。

teredo?

對于看起來是:RFC:4380`定義的Teredo地址(以``2001::/32``開頭)的地址,此屬性將返回嵌入式IP地址對``(server, client)`。 對于任何其他地址,該屬性將是``None``。

IPv6Address.__format__(fmt)?

請參考 IPv4Address 中對應(yīng)的方法文檔。

3.9 新版功能.

轉(zhuǎn)換字符串和整數(shù)?

與網(wǎng)絡(luò)模塊互操作像套接字模塊, 地址必須轉(zhuǎn)換為字符串或整數(shù). 這是使用 str()int() 內(nèi)置函數(shù):

>>>
>>> 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'))
1

請注意,IPv6范圍內(nèi)的地址被轉(zhuǎn)換為沒有范圍區(qū)域ID的整數(shù)。

運(yùn)算符?

地址對象支持一些運(yùn)算符。 除非另有說明,運(yùn)算符只能在兼容對象之間應(yīng)用(即IPv4與IPv4,IPv6與IPv6)。

比較運(yùn)算符?

地址對象可以用通常的一組比較運(yùn)算符進(jìn)行比較。具有不同范圍區(qū)域ID的相同IPv6地址是不平等的。一些例子:

>>>
>>> IPv4Address('127.0.0.2') > IPv4Address('127.0.0.1')
True
>>> IPv4Address('127.0.0.2') == IPv4Address('127.0.0.1')
False
>>> IPv4Address('127.0.0.2') != IPv4Address('127.0.0.1')
True
>>> IPv6Address('fe80::1234') == IPv6Address('fe80::1234%1')
False
>>> IPv6Address('fe80::1234%1') != IPv6Address('fe80::1234%2')
True

算術(shù)運(yùn)算符?

整數(shù)可以被添加到地址對象或從地址對象中減去。 一些例子:

>>>
>>> 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

IP網(wǎng)絡(luò)的定義?

IPv4NetworkIPv6Network 對象提供了一個定義和檢查IP網(wǎng)絡(luò)定義的機(jī)制。一個網(wǎng)絡(luò)定義由一個 掩碼 和一個 網(wǎng)絡(luò)地址 組成,因此定義了一個IP地址的范圍,當(dāng)用掩碼屏蔽(二進(jìn)制AND)時,等于網(wǎng)絡(luò)地址。 例如,一個帶有掩碼``255.255.255.0``和網(wǎng)絡(luò)地址``192.168.1.0``的網(wǎng)絡(luò)定義由包括``192.168.1.0``到``192.168.1.255``的IP地址組成。

前綴、網(wǎng)絡(luò)掩碼和主機(jī)掩碼?

有幾種相等的方法來指定IP網(wǎng)絡(luò)掩碼。 前綴 /<nbits>``是一個符號,表示在網(wǎng)絡(luò)掩碼中設(shè)置了多少個高階位。 一個 *網(wǎng)絡(luò)掩碼* 是一個設(shè)置了一定數(shù)量高階位的IP地址。 因此,前綴/24``等同于IPv4中的網(wǎng)絡(luò)掩碼``255.255.255.0``或IPv6中的網(wǎng)絡(luò)掩碼``ffff:ff00::。 此外,*主機(jī)掩碼* *網(wǎng)絡(luò)掩碼* 的邏輯取反,有時被用來表示網(wǎng)絡(luò)掩碼(例如在Cisco訪問控制列表中)。 在IPv4中,相當(dāng)于主機(jī)掩碼``0.0.0.255``的是/24`` 。

網(wǎng)絡(luò)對象?

所有由地址對象實(shí)現(xiàn)的屬性也由網(wǎng)絡(luò)對象實(shí)現(xiàn)。 此外,網(wǎng)絡(luò)對象還實(shí)現(xiàn)了額外的屬性。所有這些在 IPv4NetworkIPv6Network 之間是共同的,所以為了避免重復(fù),它們只在 IPv4Network 中記錄。網(wǎng)絡(luò)對象是 hashable,所以它們可以作為字典中的鍵使用。

class ipaddress.IPv4Network(address, strict=True)?

構(gòu)建一個 IPv4 網(wǎng)絡(luò)定義。 address 可以是以下之一:

  1. 一個由 IP 地址和可選掩碼組成的字符串,用斜線 (/) 分開。 IP 地址是網(wǎng)絡(luò)地址,掩碼可以是一個單一的數(shù)字,這意味著它是一個 前綴,或者是一個 IPv4 地址的字符串表示。 如果是后者,如果掩碼以非零字段開始,則被解釋為 網(wǎng)絡(luò)掩碼,如果以零字段開始,則被解釋為 主機(jī)掩碼,唯一的例外是全零的掩碼被視為 網(wǎng)絡(luò)掩碼。 如果沒有提供掩碼,它就被認(rèn)為是 /32。

    例如,以下的*地址*描述是等同的:192.168.1.0/24,192.168.1.0/255.255.255.0``和``192.168.1.0/0.0.0.255

  2. 一個可轉(zhuǎn)化為32位的整數(shù)。 這相當(dāng)于一個單地址的網(wǎng)絡(luò),網(wǎng)絡(luò)地址是*address*,掩碼是``/32``。

  3. 一個整數(shù)被打包成一個長度為 4 的大端序 bytes 對象。 其解釋類似于一個整數(shù) address。

  4. 一個地址描述和一個網(wǎng)絡(luò)掩碼的雙元組,其中地址描述是一個字符串,一個 32 位的整數(shù),一個 4 字節(jié)的打包整數(shù),或一個現(xiàn)有的 IPv4Address 對象;而網(wǎng)絡(luò)掩碼是一個代表前綴長度的整數(shù) (例如 24) 或一個代表前綴掩碼的字符串 (例如 255.255.255.0)。

如果 address 不是一個有效的 IPv4 地址則會引發(fā) AddressValueError。 如果掩碼不是有效的 IPv4 地址則會引發(fā) NetmaskValueError

如果 strictTrue,并且在提供的地址中設(shè)置了主機(jī)位,那么 ValueError 將被觸發(fā)。 否則,主機(jī)位將被屏蔽掉,以確定適當(dāng)?shù)木W(wǎng)絡(luò)地址。

除非另有說明,如果參數(shù)的 IP 版本與 self 不兼容,所有接受其他網(wǎng)絡(luò)/地址對象的網(wǎng)絡(luò)方法都將引發(fā) TypeError。

在 3.5 版更改: 為*address*構(gòu)造函數(shù)參數(shù)添加了雙元組形式。

version?
max_prefixlen?

請參考 IPv4Address 中的相應(yīng)屬性文檔。

is_multicast?
is_private?
is_unspecified?
is_reserved?
is_loopback?

如果這些屬性對網(wǎng)絡(luò)地址和廣播地址都是True,那么它們對整個網(wǎng)絡(luò)來說就是True。

network_address?

網(wǎng)絡(luò)的網(wǎng)絡(luò)地址。網(wǎng)絡(luò)地址和前綴長度一起唯一地定義了一個網(wǎng)絡(luò)。

broadcast_address?

網(wǎng)絡(luò)的廣播地址。發(fā)送到廣播地址的數(shù)據(jù)包應(yīng)該被網(wǎng)絡(luò)上的每臺主機(jī)所接收。

hostmask?

主機(jī)掩碼,作為一個 IPv4Address 對象。

netmask?

網(wǎng)絡(luò)掩碼,作為一個 IPv4Address 對象。

with_prefixlen?
compressed?
exploded?

網(wǎng)絡(luò)的字符串表示,其中掩碼為前綴符號。

with_prefixlencompressed 總是與 str(network) 相同,exploded 使用分解形式的網(wǎng)絡(luò)地址。

with_netmask?

網(wǎng)絡(luò)的字符串表示,掩碼用網(wǎng)絡(luò)掩碼符號表示。

with_hostmask?

網(wǎng)絡(luò)的字符串表示,其中的掩碼為主機(jī)掩碼符號。

num_addresses?

網(wǎng)絡(luò)中的地址總數(shù)。

prefixlen?

網(wǎng)絡(luò)前綴的長度,以比特為單位。

hosts()?

返回一個網(wǎng)絡(luò)中可用主機(jī)的迭代器。 可用的主機(jī)是屬于該網(wǎng)絡(luò)的所有IP地址,除了網(wǎng)絡(luò)地址本身和網(wǎng)絡(luò)廣播地址。 對于掩碼長度為31的網(wǎng)絡(luò),網(wǎng)絡(luò)地址和網(wǎng)絡(luò)廣播地址也包括在結(jié)果中。掩碼為32的網(wǎng)絡(luò)將返回一個包含單一主機(jī)地址的列表。

>>>
>>> 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')]
>>> list(ip_network('192.0.2.1/32').hosts())
[IPv4Address('192.0.2.1')]
overlaps(other)?

如果這個網(wǎng)絡(luò)部分或全部包含在*other*中,或者*other*全部包含在這個網(wǎng)絡(luò)中,則為``True``。

address_exclude(network)?

計算從這個網(wǎng)絡(luò)中移除給定的 network 后產(chǎn)生的網(wǎng)絡(luò)定義。 返回一個網(wǎng)絡(luò)對象的迭代器。 如果 network 不完全包含在這個網(wǎng)絡(luò)中則會引發(fā) 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)?

根據(jù)參數(shù)值,加入的子網(wǎng)構(gòu)成當(dāng)前的網(wǎng)絡(luò)定義。 prefixlen_diff 是我們的前綴長度應(yīng)該增加的數(shù)量。 new_prefix 是所需的子網(wǎng)的新前綴;它必須大于我們的前綴。 必須設(shè)置 prefixlen_diffnew_prefix 中的一個,且只有一個。 返回一個網(wǎng)絡(luò)對象的迭代器。

>>>
>>> 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)?

包含這個網(wǎng)絡(luò)定義的超級網(wǎng),取決于參數(shù)值。 prefixlen_diff 是我們的前綴長度應(yīng)該減少的數(shù)量。 new_prefix 是超級網(wǎng)的新前綴;它必須比我們的前綴小。 必須設(shè)置 prefixlen_diffnew_prefix 中的一個,而且只有一個。 返回一個單一的網(wǎng)絡(luò)對象。

>>>
>>> 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')
subnet_of(other)?

如果這個網(wǎng)絡(luò)是*other*的子網(wǎng),則返回``True``。

>>>
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> b.subnet_of(a)
True

3.7 新版功能.

supernet_of(other)?

如果這個網(wǎng)絡(luò)是*other*的超網(wǎng),則返回``True``。

>>>
>>> a = ip_network('192.168.1.0/24')
>>> b = ip_network('192.168.1.128/30')
>>> a.supernet_of(b)
True

3.7 新版功能.

compare_networks(other)?

將這個網(wǎng)絡(luò)與*ohter*網(wǎng)絡(luò)進(jìn)行比較。 在這個比較中,只考慮網(wǎng)絡(luò)地址;不考慮主機(jī)位。 返回是``-1`` 、 0``或``1

>>>
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.2/32'))
-1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.0/32'))
1
>>> ip_network('192.0.2.1/32').compare_networks(ip_network('192.0.2.1/32'))
0

3.7 版后已移除: 它使用與"<"、"=="和">"相同的排序和比較算法。

class ipaddress.IPv6Network(address, strict=True)?

構(gòu)建一個 IPv6 網(wǎng)絡(luò)定義。 address 可以是以下之一:

  1. 一個由IP地址和可選前綴長度組成的字符串,用斜線(/)分開。 IP地址是網(wǎng)絡(luò)地址,前綴長度必須是一個數(shù)字,即*prefix*。 如果沒有提供前綴長度,就認(rèn)為是``/128``。

    Note that currently expanded netmasks are not supported. That means 2001:db00::0/24 is a valid argument while 2001:db00::0/ffff:ff00:: is not.

  2. 一個適合128位的整數(shù)。 這相當(dāng)于一個單地址網(wǎng)絡(luò),網(wǎng)絡(luò)地址是*address*,掩碼是``/128``。

  3. 一個整數(shù)被打包成一個長度為 16 的大端序 bytes 對象。 其解釋類似于一個整數(shù)的 address

  4. 一個地址描述和一個網(wǎng)絡(luò)掩碼的雙元組,其中地址描述是一個字符串,一個 128 位的整數(shù),一個 16 字節(jié)的打包整數(shù),或者一個現(xiàn)有的 IPv6Address 對象;而網(wǎng)絡(luò)掩碼是一個代表前綴長度的整數(shù)。

如果 address 不是一個有效的 IPv6 地址則會引發(fā) AddressValueError。 如果掩碼對 IPv6 地址無效則會引發(fā) NetmaskValueError

如果 strictTrue,并且在提供的地址中設(shè)置了主機(jī)位,那么 ValueError 將被觸發(fā)。 否則,主機(jī)位將被屏蔽掉,以確定適當(dāng)?shù)木W(wǎng)絡(luò)地址。

在 3.5 版更改: 為*address*構(gòu)造函數(shù)參數(shù)添加了雙元組形式。

version?
max_prefixlen?
is_multicast?
is_private?
is_unspecified?
is_reserved?
is_loopback?
network_address?
broadcast_address?
hostmask?
netmask?
with_prefixlen?
compressed?
exploded?
with_netmask?
with_hostmask?
num_addresses?
prefixlen?
hosts()?

返回一個網(wǎng)絡(luò)中可用主機(jī)的迭代器。 可用的主機(jī)是屬于該網(wǎng)絡(luò)的所有IP地址,除了Subnet-Router任播的地址。 對于掩碼長度為127的網(wǎng)絡(luò),子網(wǎng)-路由器任播地址也包括在結(jié)果中。掩碼為128的網(wǎng)絡(luò)將返回一個包含單一主機(jī)地址的列表。

overlaps(other)?
address_exclude(network)?
subnets(prefixlen_diff=1, new_prefix=None)?
supernet(prefixlen_diff=1, new_prefix=None)?
subnet_of(other)?
supernet_of(other)?
compare_networks(other)?

請參考 IPv4Network 中的相應(yīng)屬性文檔。

is_site_local?

如果這些屬性對網(wǎng)絡(luò)地址和廣播地址都是True,那么對整個網(wǎng)絡(luò)來說就是True。

運(yùn)算符?

網(wǎng)絡(luò)對象支持一些運(yùn)算符。 除非另有說明,運(yùn)算符只能在兼容的對象之間應(yīng)用(例如,IPv4與IPv4,IPv6與IPv6)。

邏輯運(yùn)算符?

網(wǎng)絡(luò)對象可以用常規(guī)的邏輯運(yùn)算符集進(jìn)行比較。網(wǎng)絡(luò)對象首先按網(wǎng)絡(luò)地址排序,然后按網(wǎng)絡(luò)掩碼排序。

迭代?

網(wǎng)絡(luò)對象可以被迭代,以列出屬于該網(wǎng)絡(luò)的所有地址。 對于迭代,所有 主機(jī)都會被返回,包括不可用的主機(jī)(對于可用的主機(jī),使用 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')

作為地址容器的網(wǎng)絡(luò)?

網(wǎng)絡(luò)對象可以作為地址的容器。 一些例子:

>>>
>>> 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')
True
>>> IPv4Address('192.0.3.6') in IPv4Network('192.0.2.0/28')
False

接口對象?

接口對象是 hashable 的,所以它們可以作為字典中的鍵使用。

class ipaddress.IPv4Interface(address)?

構(gòu)建一個 IPv4 接口。 address 的含義與 IPv4Network 構(gòu)造器中的一樣,不同之處在于任意主機(jī)地址總是會被接受。

IPv4InterfaceIPv4Address 的一個子類,所以它繼承了該類的所有屬性。 此外,還有以下屬性可用:

ip?

地址(IPv4Address)沒有網(wǎng)絡(luò)信息。

>>>
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.ip
IPv4Address('192.0.2.5')
network?

該接口所屬的網(wǎng)絡(luò)(IPv4Network)。

>>>
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.network
IPv4Network('192.0.2.0/24')
with_prefixlen?

用前綴符號表示的接口與掩碼的字符串。

>>>
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_prefixlen
'192.0.2.5/24'
with_netmask?

帶有網(wǎng)絡(luò)的接口的網(wǎng)絡(luò)掩碼字符串表示。

>>>
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_netmask
'192.0.2.5/255.255.255.0'
with_hostmask?

帶有網(wǎng)絡(luò)的接口的主機(jī)掩碼字符串表示。

>>>
>>> interface = IPv4Interface('192.0.2.5/24')
>>> interface.with_hostmask
'192.0.2.5/0.0.0.255'
class ipaddress.IPv6Interface(address)?

構(gòu)建一個 IPv6 接口。 address 的含義與 IPv6Network 構(gòu)造器中的一樣,不同之處在于任意主機(jī)地址總是會被接受。

IPv6InterfaceIPv6Address 的一個子類,所以它繼承了該類的所有屬性。 此外,還有以下屬性可用:

ip?
network?
with_prefixlen?
with_netmask?
with_hostmask?

請參考 IPv4Interface 中的相應(yīng)屬性文檔。

運(yùn)算符?

接口對象支持一些運(yùn)算符。 除非另有說明,運(yùn)算符只能在兼容的對象之間應(yīng)用(即IPv4與IPv4,IPv6與IPv6)。

邏輯運(yùn)算符?

接口對象可以用通常的邏輯運(yùn)算符集進(jìn)行比較。

對于相等比較(==``和!=``),IP地址和網(wǎng)絡(luò)都必須是相同的對象才會相等。 一個接口不會與任何地址或網(wǎng)絡(luò)對象相等。

對于排序 (<、> 等),規(guī)則是不同的。 具有相同 IP 版本的接口和地址對象可以被比較,而地址對象總是在接口對象之前排序。 兩個接口對象首先通過它們的網(wǎng)絡(luò)進(jìn)行比較,如果它們是相同的,則通過它們的 IP 地址進(jìn)行比較。

其他模塊級別函數(shù)?

該模塊還提供以下模塊級函數(shù):

ipaddress.v4_int_to_packed(address)?

以網(wǎng)絡(luò)(大端序)順序?qū)⒁粋€地址表示為 4 個打包的字節(jié)。address 是一個 IPv4 IP 地址的整數(shù)表示。 如果整數(shù)是負(fù)數(shù)或太大而不滿足 IPv4 IP 地址要求,會觸發(fā)一個 ValueError。

>>>
>>> ipaddress.ip_address(3221225985)
IPv4Address('192.0.2.1')
>>> ipaddress.v4_int_to_packed(3221225985)
b'\xc0\x00\x02\x01'
ipaddress.v6_int_to_packed(address)?

以網(wǎng)絡(luò)(大端序)順序?qū)⒁粋€地址表示為 4 個打包的字節(jié)。address 是一個IPv6 IP地址的整數(shù)表示。 如果整數(shù)是負(fù)數(shù)或太大而不滿足 IPv6 IP 地址要求,會觸發(fā)一個 ValueError。

ipaddress.summarize_address_range(first, last)?

給出第一個和最后一個 IP 地址,返回總結(jié)的網(wǎng)絡(luò)范圍的迭代器。 first 是范圍內(nèi)的第一個 IPv4AddressIPv6Addresslast 是范圍內(nèi)的最后一個 IPv4AddressIPv6Address。 如果 firstlast 不是IP地址或不是同一版本則會引發(fā) TypeError。 如果 last 不大于 first,或者 first 的地址版本不是 4 或 6 則會引發(fā) 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)?

返回一個 IPv4NetworkIPv6Network 對象的迭代器。 addresses 是一個 IPv4NetworkIPv6Network 對象的迭代器。 如果 addresses 包含混合版本的對象則會引發(fā) 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)?

返回一個適合在網(wǎng)絡(luò)和地址之間進(jìn)行排序的鍵。 地址和網(wǎng)絡(luò)對象在默認(rèn)情況下是不可排序的;它們在本質(zhì)上是不同的,所以表達(dá)式:

IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24')

是沒有意義的。 然而,有些時候,你可能希望讓 ipaddress 對這些進(jìn)行排序。 如果你需要這樣做,你可以使用這個函數(shù)作為 sorted()key 參數(shù)。

obj 是一個網(wǎng)絡(luò)或地址對象。

自定義異常?

為了支持來自類構(gòu)造函數(shù)的更具體的錯誤報告,模塊定義了以下異常:

exception ipaddress.AddressValueError(ValueError)?

與地址有關(guān)的任何數(shù)值錯誤。

exception ipaddress.NetmaskValueError(ValueError)?

與網(wǎng)絡(luò)掩碼有關(guān)的任何數(shù)值錯誤。