Python 独立于平台/版本的方法,仅使用标准库查找我的Linux机箱中所有接口的IP地址

Python 独立于平台/版本的方法,仅使用标准库查找我的Linux机箱中所有接口的IP地址,python,linux,sockets,network-programming,ioctl,Python,Linux,Sockets,Network Programming,Ioctl,我不想使用ifconfig,因为输出在所有发行版中都不相同:我想要一种一致的方法来查找所有接口的IP地址 我计划通过解析/proc/net/dev来获取接口名,然后使用接口名来使用找到的siocgifconf ioctl查找IP地址。但也有人说,并非所有版本的Linux都适用 我正在寻找一些不使用任何非默认Python库的东西,比如netifaces。据说ioctl在所有Linux版本中都不起作用。您可以使用netifaces软件包,该软件包可以使用easy\u install安装: from

我不想使用
ifconfig
,因为输出在所有发行版中都不相同:我想要一种一致的方法来查找所有接口的IP地址

我计划通过解析
/proc/net/dev
来获取接口名,然后使用接口名来使用找到的siocgifconf ioctl查找IP地址。但也有人说,并非所有版本的Linux都适用


我正在寻找一些不使用任何非默认Python库的东西,比如
netifaces
。据说ioctl在所有Linux版本中都不起作用。

您可以使用
netifaces
软件包,该软件包可以使用
easy\u install
安装:

from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
print '%s: %s' % (ifaceName, ', '.join(addresses))

您可以使用
netifaces
软件包,该软件包可以使用
easy\u install
安装:

from netifaces import interfaces, ifaddresses, AF_INET
for ifaceName in interfaces():
addresses = [i['addr'] for i in ifaddresses(ifaceName).setdefault(AF_INET, [{'addr':'No IP addr'}] )]
print '%s: %s' % (ifaceName, ', '.join(addresses))
如果你的问题是“如何获取我计算机的所有IP地址”,我会回答

>>> import socket
>>> socket.gethostbyname_ex(socket.gethostname())
('strauch', [], ['172.16.0.100', '192.168.157.1', '192.168.60.1'])
它无法分辨接口,但使用了所有接口。

如果你的问题是“如何获取我计算机的所有IP地址”,我会回答

>>> import socket
>>> socket.gethostbyname_ex(socket.gethostname())
('strauch', [], ['172.16.0.100', '192.168.157.1', '192.168.60.1'])

它无法分辨接口,但使用了所有接口。

可能的重复(也有指向另一个可能的重复的链接!)@AIG我正在寻找一些不使用任何非标准库的东西。据说ioctl在所有Linux版本中都不起作用,所以这不是一个重复的问题。我不认为你会比
netifaces
好多少,它似乎是为了做你想做的事情而创建的:尽可能独立于平台。如果你最喜欢的发行版无法使用它,那么提交一个发布/拉取请求如何?@AlG根据他的stdlib要求,你指出了错误的副本。至少使用另一个:可能重复的(也有指向另一个可能重复的链接!)@AIG我正在寻找一些不使用任何非标准库的东西。据说ioctl在所有Linux版本中都不起作用,所以这不是一个重复的问题。我不认为你会比
netifaces
好多少,它似乎是为了做你想做的事情而创建的:尽可能独立于平台。如果你最喜欢的发行版无法使用它,那么提交一个发布/拉取请求如何?@AlG根据他的stdlib要求,你指出了错误的副本。至少使用另一种方法:以独立于平台的方式获取机器网络接口的地址并不容易。如果您不能使用
netifaces
,您可能需要查看其源代码:以独立于平台的方式获取机器网络接口的地址并不容易。如果你不能使用
netifaces
,你可能想查看它的源代码:但是它只显示环回IP,它没有显示我的接口IP是192.168.1.3。但是它只显示环回IP,它没有显示我的接口IP是192.168.1.3。