Python IPaddress 模块

17 Mar 2025 | 阅读 17 分钟

我们都听说过“IP地址”这个术语,以及每个设备如何与它相关联。在“IP地址”中,IP代表互联网协议,它指的是定位互联网上的设备。互联网协议是由权威机构定义并通过本地网络或互联网发送的、管理正确数据格式的协议或规则集。我们都有自己的住址,通过它别人可以找到或定位我们,同样,我们的设备也有自己的地址。我们设备在本地网络或互联网上的虚拟地址被称为我们设备的IP地址。人们可以使用设备的IP地址来定位设备所在的位置或设备从何处连接到互联网。IP地址非常有用,因为它有助于减少网络和其他犯罪,也有助于定位丢失的设备。当设备使用互联网或本地网络时,我们可以使用IP地址来找出设备所在的位置,这样我们也可以定位使用该设备的人。IP地址还有助于在连接到互联网或本地网络的两个或多个设备之间发送信息和数据。IP地址是由四个数字组成的一组地址,对于智能手机、Wi-Fi路由器、网站等不同设备,它们是不同的。了解IP地址使我们很容易识别协议是从智能手机、网站还是Wi-Fi路由器发送的。

我们可以使用许多方法来操作给定的IP地址。我们甚至可以操作、修改或更改系统或网站的IP地址。此外,IP地址有不同的类型,因此,需要不同的方法来操作或修改不同类型的IP地址。许多编程语言为我们提供了可以用来操作给定IP地址的包和库。这些库附带了许多可以处理不同类型IP地址的函数。如果我们具体谈论Python,它也有可以处理不同类型IP地址的模块和包。Python的ipaddress模块就是Python的这样一个包,它附带了许多内置函数。我们可以使用这个模块的这些内置函数来操作给定的IP地址。因此,在本教程中,我们将学习Python的ipaddress模块,并学习如何使用这个模块操作给定的IP地址。

Python Ipaddress模块简介

正如我们已经谈论过IP地址,到现在我们应该已经知道IP地址是多么重要了。互联网上的每个设备都有一个IP地址,没有IP地址,任何设备都无法在互联网上通信或工作。不同类型的IP地址可以通过给定IP地址中存在的不同位数来区分,这样我们就可以找出给定IP地址属于哪种类型的设备。Python的ipaddress模块专门设计用于处理不同类型的IP地址,并具有许多功能。这个模块可以通过在Python程序中使用其函数来创建、操作、修改IP地址。

该模块的功能主要分为以下两类

  1. IPv4Address 类函数
  2. IPv6Address 类函数

IPv4Address和IPv6Address类函数是ipaddress模块的不同类型的函数,分别用于处理IPv4和IPv6格式的IP地址。IPv6和IPv4类函数共享多个常见功能,并且工作方式相似。因此,在本教程中,我们将只讨论IPv4格式类及其用于操作IP地址的函数。如果我们理解了IPv4类格式函数的工作原理,那么理解第二类函数将变得非常简单和容易。我们将在本教程的实现部分学习这个IPv4Address和这个类别的函数。但在进入这个模块的实现部分之前,我们必须先完成ipaddress模块的安装过程。

Python的Ipaddress模块:安装

ipaddress模块非常简单易用,我们可以很容易地使用该模块的函数来操作给定的IP地址,但是在我们开始使用该模块的函数操作或处理IP地址之前,我们首先必须确保ipaddress模块存在于我们的系统中。ipaddress模块不是Python的内置模块(直到Python的最新版本),这意味着该模块需要一个外部安装过程才能安装到我们的系统中。因此,如果ipaddress模块尚未安装在我们的系统中,我们必须通过执行该模块给定的安装过程来安装它。尽管有许多方法可以用于安装该模块,但pip安装器方法是该模块最简单易用的安装方法。因此,在该模块的安装部分,我们将使用pip安装方法来在我们的设备中安装此ipaddress模块。在通过命令提示符shell安装此模块时,我们将有一个选项来更改默认目录(模块将安装到其中),但建议将其安装在默认目录中。要使用pip安装方法安装此模块,我们首先将打开我们设备中的命令提示符shell并在其中写入以下给定命令

如上所示,在终端shell中写入安装命令后,我们只需按下“回车”键即可开始该模块的安装过程。一旦安装过程开始,我们将不得不等待所有依赖项完全下载。

Python IPaddress Module

正如我们所看到的,命令提示符shell的安装屏幕上现在显示“ipaddress模块已成功安装”消息。这意味着ipaddress模块已成功安装到我们的系统中,并且当我们运行使用该模块功能的Python程序时,它将被验证。

注意:Python的ipaddress模块现在是Python最新版本内置的,因此,如果有人拥有最新版本的Python,则无需执行此安装过程。

由于ipaddress模块现在已存在于我们的系统中,我们可以开始使用此模块并理解此模块的实现。

Python的Ipaddress模块:实现

在本部分中,我们将学习如何使用此模块的函数在Python程序中操作给定的IP地址。我们将在示例程序中使用IPv4类格式函数并理解它们的实现。但首先,我们将学习IP地址的IPv4Address类格式以及此格式下的ipaddress模块函数。

ipaddress模块的IPv4Address

此模块的IPv4Address类格式包含IPv4类型的IP地址格式以及我们可以用来操作给定IP地址的不同函数。此模块的IPv4Address类别函数在IPv4格式上工作并共享共同的功能。我们可以通过为此IPv4Address格式创建对象来使用此类别下的函数。

我们可以在给定的Python程序中使用以下语法来创建或构造一个函数对象,以便在程序中使用此类别中的函数

正如我们所看到的,上面给出的语法在IPv4Address对象构造中只接受一个参数。在创建IPv4格式对象时,我们唯一需要提供的参数是一个IP地址,该地址可以在数据中给出,也可以由用户给出。

此格式中有许多IPv4类格式函数,但在此处我们只讨论其中一些重要的,它们属于ipaddress模块的IPv4Address类别。

以下是一些最重要的IPv4Address类别函数及其详细说明

(i) max_prefixlen ():此ipaddress模块的函数返回给定IP地址中存在的总位数。我们可以在Python程序中使用此ipaddress模块的函数来返回IP地址的总位数。程序中由IPv4Address类对象表示的给定IP地址将返回位数(IPv4格式为32位,IPv6格式为128位)。

(ii) is_link_local ():此函数只在输出中返回true和false,用于检查给定IP地址是否保留用于链路本地使用。当程序中给定的IP地址保留用于链路本地使用时,ipaddress模块的is_link_local()函数将在输出中返回true;否则,它将返回false。

(iii) is_reserved ():IPv4类格式的is_reserved()函数也在输出中只返回true和false。我们可以使用ipaddress模块的此函数来查找给定IP地址是否为IETF保留。如果给定IP地址为IETF保留,则此函数将在输出中返回true;否则,它将返回false。

此模块通过在输出中返回 true 和 false 来帮助我们识别给定的 IP 地址是否为公共地址。

(iv) is_global ():我们可以使用ipaddress模块的is_global()函数来区分公共或私有地址,并找出给定的IP地址是私有还是公共。如果程序中给定的IP地址分配给公共网络,则此函数将在输出中返回true;否则,此函数将返回false。

(v) is_multicast ():我们可以使用此函数来查找程序中的IP地址是否用于或保留用于多播使用(这意味着给定的IP地址由多个设备使用)。当程序中给定的IP地址保留用于多播使用时,ipaddress模块的is_multicast()函数将在输出中返回true,否则,在所有其他情况下将返回false。

(vi) is_loopback ():此函数只在输出中返回true和false,用于检查给定的IP地址是否为环回类型IP地址。我们可以在Python程序中使用ipaddress模块的is_loopback()函数,通过检查程序的输出来判断给定IP地址是否为环回地址。如果执行此函数后程序的输出为True,则表示程序中给定的IP地址是环回地址,否则表示给定地址不是环回地址。

(vii) is_unspecified ():程序中给定的任何IP地址都属于两种类型(指定和未指定)。现在,如果我们想检查程序中给定的IP地址是指定还是未指定,我们可以使用ipaddress模块的is_unspecified()。ipaddress的is_unspecified()函数在程序中给定的IP地址未指定时返回true,在IP地址指定时返回false。

(viii) is_private ():ipaddress的is_private()函数与is_global()函数类似。我们还可以使用此函数来检查程序中给定的IP地址是公共IP地址还是私有IP地址。当程序中给定的IP地址是私有时,此函数将返回true;否则,它将在输出中返回false。

这些是ipaddress模块的一些重要的IPv4Address类函数,我们可以在Python程序中使用它们来从给定的IP地址中找出详细信息。我们可以使用这些函数的解释来从程序中给定的IP地址中找出特定的详细信息。除此之外,我们还可以在示例程序中使用比较运算符来比较程序中给定的IP地址的地址对象。一旦在程序中创建了地址对象,我们还可以对其执行加法或减法,并在减法对象中添加或减去整数。现在,我们将通过在示例程序中使用此类别格式的函数来理解ipaddress模块的IPv4Address类别。我们将在示例程序中给出一个IP地址,然后使用我们上面学到的函数对其进行操作。这样,我们将理解这些IPv4类函数的功能和实现。请看以下示例程序以理解ipaddress模块的IPv4Address格式函数的功能

示例 1:请看以下 Python 程序,我们在其中使用 IPv4Address 格式函数操作了一个给定的 IP 地址

输出

Total no of bits present in the given IP address:  32
The given IP address is reserved for multicast use:  False
The given IP address allocated for private networks:  False
The given IP address allocated with global network:  True
If the given IP address is unspecified network address:  False
If the given IP address is otherwise IETF reserved:  False
If the given IP address is a loopback IP address:  False
If the given IP address is a Link-local IP address:  False
The Next IP address in the series of given IP address is:  112.69.240.31
The previous IP address in the series of given IP address is:  112.69.240.29
Is the ipFirst IP address defined by us is greater than the ipSecond IP address:  True

如我们所见,对于给定的IP地址,我们打印了许多与之相关的属性。我们已经找出了与给定IP地址相关的许多事物。我们还找出了给定IP地址系列中的下一个和上一个IP地址。我们还在程序中比较了两个定义的IP地址,并找出了哪个更大。这就是我们如何使用IPv4Address类函数以及IPv6Address类函数来分别处理和操作给定的IPv4和IPv6格式IP地址。

解释:我们首先在程序中将ipaddress模块导入为ipa,以定义IPv4Address类对象。之后,我们使用IPv4Address()函数在变量ipObj中定义了IPv4Address类对象,以便在该格式中使用IPv4格式函数。在IPv4Address()函数内部,我们使用了一个IP地址作为函数的参数,以便我们可以操作给定的IP地址。之后,我们使用了定义了IPv4Address类对象的ipObj变量和IPv4格式函数来查找与给定IP地址相关的各种属性。我们在程序中发现,如果给定的IP地址是私有的还是全局的,它是否是本地链接地址,它是指定的还是未指定的,以及许多其他IPv4格式函数的属性。之后,我们对给定的IP地址进行了整数加减运算,以找出该行中的下一个和上一个IP地址。最后,我们比较了程序中定义的两个IP地址,并找出了哪个更大。我们已经使用IPv4Address类函数对给定的IPv4格式IP地址执行了所有主要功能。

IPv4Network 类格式

使用IPv4Network格式定义的类对象用于定义和检查IPv4类格式的IP网络。我们为IPv4Address格式学习的所有函数和属性在IPv4Network类格式中都有效,但此IPv4Network类格式还具有一些附加函数和属性,这些函数和属性在检查给定IP地址时非常有用。因此,学习IPv4Network类格式的所有这些属性和函数对于在示例程序中使用它们来检查给定的IP网络变得很重要。但在我们学习这些IPv4Network类格式函数之前,我们应该学习如何定义IPv4Network的类对象,因为只有在示例程序中定义了IPv4Network类对象之后,我们才能使用这些属性和函数。以下是用于在Python程序中定义IPv4Network类对象的语法

正如我们所看到的,我们必须在IPv4Network函数中提供给定的IP网络作为参数,才能在程序中定义IPv4Network类对象。IPv4Network函数只接受这个参数,之后我们就可以开始使用IPv4Network类格式的函数和属性来检查这个给定的IP网络。

以下是IPv4Network类格式中存在的一些此类属性和函数的简要描述

(i) compare_networks(其他IP地址):此IPv4Network类格式的函数用于通过网络的IP地址比较两个网络。我们可以使用此函数将给定的IP网络与作为函数参数提供的其他IP网络进行比较。此函数的结果为-1(当给定IP网络小于提供的IP网络时),0(当两个IP网络相等时),1(当给定IP网络大于提供的IP网络时)。我们可以使用输出中给定的这些值来比较给定的IP网络与提供的IP网络。

(ii) subnet_of(其他IP地址):subnet_of()是IPv4Network格式的一个函数,我们可以在示例程序中使用它来检查给定的IP网络是否是第二个IP网络的子网。我们必须将这个第二个IP网络作为参数提供给subnet_of()函数,之后我们才能知道给定的IP网络是否是所提供IP网络的子网。此函数以“true”和“false”的形式返回执行结果。

(iii) subnets(prefixlen_diff):我们可以使用IPv4Network类格式的此函数,通过为给定IP网络提供前缀长度差来查找给定IP网络的子网IP网络。我们必须在程序中提供的前缀长度差应为整数形式,例如1、2等。

(iv) hosts():host()是IPv4Network类格式中的一个函数,我们可以在示例程序中使用它,通过将给定的IP地址作为参数提供给此函数来找出给定IP网络中可用主机的数量。

(v) overlaps(其他IP地址):IPv4Network类格式的overlaps()函数可用于查找程序中给定的IP网络是否完全或部分与另一个IP网络重叠。我们必须将此其他IP网络作为参数提供给overlaps()函数以查找结果。

(vi) prefixlen:我们可以使用IPv4Network的prefixlen属性在输出中打印给定IP网络前缀的位长度。

(vii) netmask:我们可以使用IPv4Network格式的netmask属性来找出给定IP网络的网络掩码,因为此属性在执行时会在输出中返回网络掩码。

除此之外,IPv4Network类格式中还存在许多其他主要的属性和函数,但我们在此部分不讨论它们。我们将通过在示例程序中使用它们来理解上述所有函数和属性以及IPv4Network的其他重要函数的实现。我们将在示例程序中给出一个IP网络,然后我们将使用IPv4Network类格式的所有主要属性和函数来检查给定的IP网络。

请看下面的示例程序,以理解IPv4Network格式的函数和属性的实现

示例 2:请看以下 Python 程序,我们在其中检查了一个给定的 IP 网络

输出

The actual network address of the given IP network in the program is:  192.168.1.0
The actual broadcast address of the given IP network in the program is:  192.168.1.0
The Network mask of the given IP network is:  255.255.255.255
The With Net mask value of the given IP network is:  192.168.1.0/255.255.255.255
The with host mask value of the given IP network is:  192.168.1.0/0.0.0.0
The prefix Length of the given IP network in bits format is:  32
The Total number of usable hosts that comes under the given IP network except the network itself are:  1
If the given IP network is overlapping the 192.168.0.0/16 IP address:  False
The Supernet of the given IP network is:  192.168.1.0/31
If the given IP network is a subnet network of 192.168.0.0/24 IP address:  False
If the given IP network is a supernet network of 192.168.0.0/24 IP address:  False
The result of the Comparison the given IP network with the provided 192.168.0.0/24 network address:  1

如我们所见,我们已经使用示例程序中的IPv4Network格式函数和属性检查并找出了给定IP网络的属性。


下一个主题Python PyLint 模块