ipaddress --- IPv4/IPv6 操作庫?

源代碼: Lib/ipaddress.py


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

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

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

3.3 新版功能.

方便的工廠(chǎng)函數?

ipaddress 模塊提供來(lái)工廠(chǎng)函數來(lái)方便地創(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.

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

IP 地址?

地址對象?

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

class ipaddress.IPv4Address(address)?

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

以下是有效的 IPv4 地址:

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

  2. 一個(gè)32位可容納的整數。

  3. 一個(gè)長(cháng)度為 4 的封裝在 bytes 對象中的整數(高位優(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 版更改: 前導零可被接受,即使是在可能與八進(jìn)制表示混淆的情況下也會(huì )被接受。

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

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

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

version?

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

max_prefixlen?

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

前綴定義了地址中的前導位數量,通過(guò)比較來(lái)確定一個(gè)地址是否是網(wǎng)絡(luò )的一部分。

compressed?
exploded?

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

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

packed?

這個(gè)地址的二進(jìn)制表示——一個(gè)適當長(cháng)度的 bytes 對象(最高的八位在最前)。 對于 IPv4 來(lái)說(shuō)是 4 字節,對于 IPv6 來(lái)說(shuō)是 16 字節。

reverse_pointer?

IP地址的反向DNS PTR記錄的名稱(chēng),例如:

>>>
>>> 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查詢(xún)的名稱(chēng),而不是已解析的主機名本身。

3.5 新版功能.

is_multicast?

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

is_private?

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

is_global?

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

3.4 新版功能.

is_unspecified?

當地址未指定時(shí)為``True`` 。 參見(jiàn) RFC 5735 (IPv4) 或 RFC 2373 (IPv6).

is_reserved?

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

is_loopback?

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

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

IPv4Address.__format__(fmt)?

返回一個(gè)IP地址的字符串表示,由一個(gè)明確的格式字符串控制。fmt 可以是以下之一: 's',默認選項,相當于 str(),'b' 用于零填充的二進(jìn)制字符串,'X' 或者 'x' 用于大寫(xiě)或小寫(xiě)的十六進(jìn)制表示,或者 'n' 相當于 'b' 用于 IPv4 地址和 'x' 用于 IPv6 地址。 對于二進(jìn)制和十六進(jìn)制表示法,可以使用形式指定器 '#' 和分組選項 '_'。 __format__format、 str.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è) IPv6 地址。 如果 address 不是一個(gè)有效的 IPv6 地址,會(huì )拋出 AddressValueError 。

以下是有效的 IPv6 地址:

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

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

  2. 適合 128 位的整數.

  3. 一個(gè)打包在長(cháng)度為 16 字節的大端序 bytes 對象中的整數。

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

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

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

exploded?

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

關(guān)于以下屬性和方法,請參見(jiàn) IPv4Address 類(lèi)的相應文檔。

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 來(lái)檢測此地址是否位于 RFC 4193 所定義的本地唯一地址空間中。

ipv4_mapped?

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

scope_id?

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

sixtofour?

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

teredo?

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

IPv6Address.__format__(fmt)?

請參考 IPv4Address 中對應的方法文檔。

3.9 新版功能.

轉換字符串和整數?

與網(wǎng)絡(luò )模塊互操作像套接字模塊, 地址必須轉換為字符串或整數. 這是使用 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'))
1

請注意,IPv6范圍內的地址被轉換為沒(méi)有范圍區域ID的整數。

運算符?

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

比較運算符?

地址對象可以用通常的一組比較運算符進(jìn)行比較。具有不同范圍區域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ù)運算符?

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

>>>
>>> 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 對象提供了一個(gè)定義和檢查IP網(wǎng)絡(luò )定義的機制。一個(gè)網(wǎng)絡(luò )定義由一個(gè) 掩碼 和一個(gè) 網(wǎng)絡(luò )地址 組成,因此定義了一個(gè)IP地址的范圍,當用掩碼屏蔽(二進(jìn)制AND)時(shí),等于網(wǎng)絡(luò )地址。 例如,一個(gè)帶有掩碼``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ò )掩碼和主機掩碼?

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

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

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

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

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

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

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

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

  3. 一個(gè)整數被打包成一個(gè)長(cháng)度為 4 的大端序 bytes 對象。 其解釋類(lèi)似于一個(gè)整數 address。

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

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

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

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

在 3.5 版更改: 為*address*構造函數參數添加了雙元組形式。

version?
max_prefixlen?

請參考 IPv4Address 中的相應屬性文檔。

is_multicast?
is_private?
is_unspecified?
is_reserved?
is_loopback?

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

network_address?

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

broadcast_address?

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

hostmask?

主機掩碼,作為一個(gè) IPv4Address 對象。

netmask?

網(wǎng)絡(luò )掩碼,作為一個(gè) 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ò )的字符串表示,其中的掩碼為主機掩碼符號。

num_addresses?

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

prefixlen?

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

hosts()?

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

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

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

address_exclude(network)?

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

根據參數值,加入的子網(wǎng)構成當前的網(wǎng)絡(luò )定義。 prefixlen_diff 是我們的前綴長(cháng)度應該增加的數量。 new_prefix 是所需的子網(wǎng)的新前綴;它必須大于我們的前綴。 必須設置 prefixlen_diffnew_prefix 中的一個(gè),且只有一個(gè)。 返回一個(gè)網(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)?

包含這個(gè)網(wǎng)絡(luò )定義的超級網(wǎng),取決于參數值。 prefixlen_diff 是我們的前綴長(cháng)度應該減少的數量。 new_prefix 是超級網(wǎng)的新前綴;它必須比我們的前綴小。 必須設置 prefixlen_diffnew_prefix 中的一個(gè),而且只有一個(gè)。 返回一個(gè)單一的網(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)?

如果這個(gè)網(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)?

如果這個(gè)網(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)?

將這個(gè)網(wǎng)絡(luò )與*ohter*網(wǎng)絡(luò )進(jìn)行比較。 在這個(gè)比較中,只考慮網(wǎng)絡(luò )地址;不考慮主機位。 返回是``-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è) IPv6 網(wǎng)絡(luò )定義。 address 可以是以下之一:

  1. 一個(gè)由IP地址和可選前綴長(cháng)度組成的字符串,用斜線(xiàn)(/)分開(kāi)。 IP地址是網(wǎng)絡(luò )地址,前綴長(cháng)度必須是一個(gè)數字,即*prefix*。 如果沒(méi)有提供前綴長(cháng)度,就認為是``/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. 一個(gè)適合128位的整數。 這相當于一個(gè)單地址網(wǎng)絡(luò ),網(wǎng)絡(luò )地址是*address*,掩碼是``/128``。

  3. 一個(gè)整數被打包成一個(gè)長(cháng)度為 16 的大端序 bytes 對象。 其解釋類(lèi)似于一個(gè)整數的 address。

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

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

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

在 3.5 版更改: 為*address*構造函數參數添加了雙元組形式。

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

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

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 中的相應屬性文檔。

is_site_local?

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

運算符?

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

邏輯運算符?

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

迭代?

網(wǎng)絡(luò )對象可以被迭代,以列出屬于該網(wǎng)絡(luò )的所有地址。 對于迭代,所有 主機都會(huì )被返回,包括不可用的主機(對于可用的主機,使用 hosts() 方法)。 一個(gè)例子:

>>>
>>> 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è) IPv4 接口。 address 的含義與 IPv4Network 構造器中的一樣,不同之處在于任意主機地址總是會(huì )被接受。

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

ip?

地址(IPv4Address)沒(méi)有網(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ò )的接口的主機掩碼字符串表示。

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

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

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

ip?
network?
with_prefixlen?
with_netmask?
with_hostmask?

請參考 IPv4Interface 中的相應屬性文檔。

運算符?

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

邏輯運算符?

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

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

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

其他模塊級別函數?

該模塊還提供以下模塊級函數:

ipaddress.v4_int_to_packed(address)?

以網(wǎng)絡(luò )(大端序)順序將一個(gè)地址表示為 4 個(gè)打包的字節。address 是一個(gè) IPv4 IP 地址的整數表示。 如果整數是負數或太大而不滿(mǎn)足 IPv4 IP 地址要求,會(huì )觸發(fā)一個(gè) 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ò )(大端序)順序將一個(gè)地址表示為 4 個(gè)打包的字節。address 是一個(gè)IPv6 IP地址的整數表示。 如果整數是負數或太大而不滿(mǎn)足 IPv6 IP 地址要求,會(huì )觸發(fā)一個(gè) ValueError。

ipaddress.summarize_address_range(first, last)?

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

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

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

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

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

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

自定義異常?

為了支持來(lái)自類(lèi)構造函數的更具體的錯誤報告,模塊定義了以下異常:

exception ipaddress.AddressValueError(ValueError)?

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

exception ipaddress.NetmaskValueError(ValueError)?

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