📜  如何在python中获取本地ip(1)

📅  最后修改于: 2023-12-03 14:52:51.244000             🧑  作者: Mango

如何在Python中获取本地IP

在Python中获取本地IP地址非常简单,可以使用Python标准库中的socket模块来实现。下面,我们将介绍两种获取本地IP地址的方法。

方法一:获取本地IP地址(仅适用于IPv4)
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地址,需要使用下面的方法。

方法二:获取本地IP地址(适用于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

这两种方法中,第二种方法更为通用,建议使用。