为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2022-01-05 20:28:53
我想知道我系统的当前 IP 地址。到目前为止,我无法为我的设备找到任何解决方案。我尝试过socket.gethostbyname(socket.gethostname())方法,但它让我回归127.0.0.1。是否有任何 Python 包可以在 Ubuntu 和 Linux 中运行良好?
查看完整描述

2 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

请记住,您的系统可以具有多个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'

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


查看完整回答
反对 回复 2022-01-05
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

您可以从 Python 进行 bash 调用:


import os

os.system('ipconfig')

或与子进程


cmd = 'ipconfig'

results = subprocess.run(

           cmd, shell=True, universal_newlines=True, check=True)

print(results.stdout)


查看完整回答
反对 回复 2022-01-05
  • 2 回答
  • 0 关注
  • 747 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信