如何使用Python查找当前连接(LAN或WiFi)的IP地址?

tus*_*cmc 1 python ip-address

我想知道我的系统当前的 IP 地址。截至目前,我无法找到适合我的设备的任何解决方案。我尝试过socket.gethostbyname(socket.gethostname())方法,但它正在返回我127.0.0.1

有没有可以在 Ubuntu 和 Linux 上运行良好的 Python 包?

lar*_*sks 5

请记住,您的系统在许多接口上可以有多个IP 地址(如果您使用容器或虚拟机,则尤其如此),因此您需要明确您想要哪个IP 地址。

此外,如果您的设备通过某种 NAT 运行,则可能存在与您的设备关联的外部地址,该地址在您的任何接口上都不可见。

因此,如果您的问题没有得到一些澄清,就很难确切地知道您在寻找什么。出于本答案的目的,我假设您想要“与默认路由关联的接口上的第一个 IP 地址”。我们可以使用netifaces模块来帮助解决这个问题:

首先,我们需要默认接口​​的名称。我们可以使用该netifaces.gateways()方法来获取网关列表:

>>> import netifaces
>>> netifaces.gateways()
{'default': {2: (u'192.168.1.1', u'eth0')}, 2: [(u'192.168.1.1', u'eth0', True)]}
Run Code Online (Sandbox Code Playgroud)

default代表我们的默认网关,该键的值是一个字典,其中键是地址族,因此要获取我们需要的接口名称:

>>> netifaces.gateways()['default'][netifaces.AF_INET][1]
u'eth0'
Run Code Online (Sandbox Code Playgroud)

一旦我们有了默认接口的名称,我们就可以使用以下方法查找它netifaces.interfaces()

>>> iface = netifaces.gateways()['default'][netifaces.AF_INET][1]
>>> netifaces.ifaddresses(iface)
{17: [{'broadcast': u'ff:ff:ff:ff:ff:ff', 'addr': u'64:00:6a:7d:06:1a'}], 2: [{'broadcast': u'192.168.1.255', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.24'}, {'broadcast': u'192.168.1.100', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.100'}, {'broadcast': u'192.168.1.101', 'netmask': u'255.255.255.0', 'addr': u'192.168.1.101'}], 10: [{'netmask': u'ffff:ffff:ffff:ffff::/64', 'addr': u'fe80::5da1:2401:a725:d2e0%eth0'}]}
Run Code Online (Sandbox Code Playgroud)

这为我们提供了一堆接口信息,同样由地址族键入。获取接口的第一个IP地址:

>>> netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr']
u'192.168.1.24'
Run Code Online (Sandbox Code Playgroud)

这可能就是您正在寻找的价值。