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

问题描述 投票:-1回答:2

这个问题在这里已有答案:

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

是否有任何Python包可以在Ubuntu和Linux中运行良好?

python ip-address
2个回答
1
投票

请记住,您的系统可以在许多接口上具有多个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)]}

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

>>> netifaces.gateways()['default'][netifaces.AF_INET][1]
u'eth0'

一旦我们拥有默认界面的名称,我们就可以使用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'}]}

这给我们带来了一堆接口信息,再次由地址系列键入。获取接口的第一个ip地址:

>>> netifaces.ifaddresses(iface)[netifaces.AF_INET][0]['addr']
u'192.168.1.24'

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


0
投票

你可以用Python做一个bash调用:

import os
os.system('ipconfig')

或者使用子流程

cmd = 'ipconfig'
results = subprocess.run(
           cmd, shell=True, universal_newlines=True, check=True)
print(results.stdout)
© www.soinside.com 2019 - 2024. All rights reserved.