📅  最后修改于: 2023-12-03 14:52:51.244000             🧑  作者: Mango
在Python中获取本地IP地址非常简单,可以使用Python标准库中的socket
模块来实现。下面,我们将介绍两种获取本地IP地址的方法。
import socket
# 获取本机IP地址
def get_local_ip():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
s.close()
return ip
该方法中,我们首先创建了一个UDP socket对象s
,然后通过其connect()
方法连接到Google的DNS服务器8.8.8.8
的80端口(该步骤可以任意连接任何一个存在于Internet中且响应正常的IP地址和端口号),并通过其getsockname()
方法获取本地IP地址和端口号的元组。最后,我们关闭了socket对象s
并返回本地IP地址。
该方法有一个缺点,即只适用于IPv4地址。如果你的程序需要处理IPv4地址和IPv6地址,需要使用下面的方法。
import socket
# 获取本机IP地址
def get_local_ip():
ip = None
for family, _, _, _, address in socket.getaddrinfo(socket.gethostname(), None, socket.AF_UNSPEC, socket.SOCK_DGRAM, socket.IPPROTO_IP):
if family == socket.AF_INET or family == socket.AF_INET6:
ip = address[0]
break
return ip
该方法中,我们首先调用socket.gethostname()
方法获取当前主机的主机名,然后调用socket.getaddrinfo()
方法获取主机名对应的所有IP地址和socket地址相关信息的列表,并使用socket.AF_UNSPEC
参数指定获取所有协议版本的地址。接下来,我们使用for
循环遍历列表中的每个地址,并通过if
语句判断它是否为IPv4地址或IPv6地址,如果是则将其作为本地IP地址并返回。如果遍历完整个列表都没有找到IPv4地址或IPv6地址,则返回None
。
这两种方法中,第二种方法更为通用,建议使用。