跳转到主要内容

便携式网络接口信息。

项目描述

Linux/macOS

Build Status (Linux/Mac)

Windows

Build Status (Windows)

1. 这是啥?

有一段时间,我一直很烦恼,因为从Python中获取机器网络接口的地址(们)没有简单的方法。这种困难有很好的原因,那就是以可移植的方式做到这一点几乎是不可能的。然而,在我看来,应该有一个可以easy_install的包来处理您所使用机器上的这些细节,这样您就可以继续编写Python代码,而不必担心系统相关的低级网络API的细节。

此包试图解决这个问题。

2. 我怎么用?

首先,您需要安装它,可以通过输入以下命令来完成

tar xvzf netifaces-0.10.8.tar.gz
cd netifaces-0.10.8
python setup.py install

请注意,您需要您平台的相关开发工具,因为netifaces是用C编写的,以这种方式安装将编译扩展。

完成之后,您需要启动Python并执行以下类似操作

>>> import netifaces

然后如果您输入

>>> netifaces.interfaces()
['lo0', 'gif0', 'stf0', 'en0', 'en1', 'fw0']

您将看到您机器的接口标识符列表。

您可以通过以下方式获取特定接口的地址:

>>> netifaces.ifaddresses('lo0')
{18: [{'addr': ''}], 2: [{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}], 30: [{'peer': '::1', 'netmask': 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', 'addr': '::1'}, {'peer': '', 'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::1%lo0'}]}

嗯,这个结果看起来有点难以理解;让我们把它分解一下,解释每个部分的意思。它返回了一个字典,所以让我们先看看那里。

{ 18: [...], 2: [...], 30: [...] }

每个数字都指的是一个特定的地址族。在这种情况下,我们列出了三个地址族;在我的系统中,18代表AF_LINK(表示链路层接口,例如以太网),2代表AF_INET(常规互联网地址),30代表AF_INET6(IPv6)。

但是等等!不要在您的代码中使用这些数字。这里的数值是系统相关的;幸运的是,我在编写netifaces时想到了这一点,所以该模块声明了一组您可能需要的值。例如:

>>> netifaces.AF_LINK
18

再次强调,在您的系统中,数字可能不同。

所以,我们已经确定,返回的字典为每个有地址的地址族都有一条记录。现在让我们看看AF_INET地址。

>>> addrs = netifaces.ifaddresses('lo0')
>>> addrs[netifaces.AF_INET]
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]

您可能想知道为什么这个值是一个列表。原因是接口可能拥有多个地址,甚至在同一族内。我再重复一遍:您可以为每个接口关联多个同类型的地址。

请求“特定接口的”地址没有意义。

没错,我们可以看到这个特定的接口只有一个地址,因为它是一个回环接口,所以它是点对点的,因此有一个peer地址而不是广播地址。

让我们看看一个更有趣的接口。

>>> addrs = netifaces.ifaddresses('en0')
>>> addrs[netifaces.AF_INET]
[{'broadcast': '10.15.255.255', 'netmask': '255.240.0.0', 'addr': '10.0.1.4'}, {'broadcast': '192.168.0.255', 'addr': '192.168.0.47'}]

这个接口有两个地址(看,我告诉过您…)它们都是常规的IPv4地址,尽管在一个例子中子网掩码被改为了默认值。如果子网掩码设置为地址范围的默认值,您的系统上可能不会出现子网掩码。

因为这个接口不是点对点的,它也有广播地址。

现在,假设我们想要获取MAC地址,也就是运行此接口的以太网适配器的硬件地址。我们可以这样做:

>>> addrs[netifaces.AF_LINK]
[{'addr': '00:12:34:56:78:9a'}]

请注意,在没有getifaddrs()的平台或它们恰好实现了SIOCGIFHWADDR的情况下,这可能不可用。另外,您只得到地址;您不太可能看到其他任何带有AF_LINK地址的内容。哦,还有,不要假设所有AF_LINK地址都是以太网;例如,您可能在Mac上,在这种情况下:

>>> addrs = netifaces.ifaddresses('fw0')
>>> addrs[netifaces.AF_LINK]
[{'addr': '00:12:34:56:78:9a:bc:de'}]

不,这不是一个异常长的以太网MAC地址——这是一个FireWire地址。

从版本0.10.0开始,您还可以获取您机器上的网关列表

>>> netifaces.gateways()
{2: [('10.0.1.1', 'en0', True), ('10.2.1.1', 'en1', False)], 30: [('fe80::1', 'en0', True)], 'default': { 2: ('10.0.1.1', 'en0'), 30: ('fe80::1', 'en0') }}

这个字典以地址族为键——在这种情况下,是AF_INET——每个条目都是一个包含网关的列表,格式为(address, interface, is_default)元组。请注意,这里我们有两个单独的IPv4(AF_INET)网关;一些操作系统支持这种配置,可以根据源路由包,或者基于管理配置的路由表进行路由。

为了方便,我们还允许您使用特殊值'default'索引字典,它返回一个将地址族映射到每个情况的默认网关的字典。因此,您可以使用以下方法获取默认IPv4网关:

>>> gws = netifaces.gateways()
>>> gws['default'][netifaces.AF_INET]
('10.0.1.1', 'en0')

请注意,对于任何给定的地址族,可能没有默认网关;这在IPv6中非常常见,在IPv4中较少见,但即使对于AF_INET也可能发生。

顺便说一下,如果您正在尝试配置您的机器以使用同一地址族的多个网关,那么仔细查看您操作系统的文档是一个非常不错的想法,因为一些系统可能会变得极度混乱,或者以非显而易见的方式路由数据包。

我非常想听到任何(任何平台)的人的信息,对于他们来说,gateways()方法没有产生预期的结果。从操作系统(无论我们谈论的是哪个操作系统)中提取这些信息相当复杂,因此我预计至少有一个系统,这种方法根本不起作用。

3. 这太棒了!它在哪些平台上运行?

它在OS X、Linux和Windows上进行了常规测试。它也已在Solaris上成功使用,并预期将在其他类UNIX系统上正常运行。如果您正在运行不受支持的东西,并且希望贡献补丁,请使用Github发送拉取请求。

4. 这个项目使用什么许可协议?

这是一个MIT风格的许可协议。请参阅LICENSE

5. 为什么跳到0.10.0?

因为有人发布了带有版本0.9.0的netifaces分支。希望跳过版本号可以消除任何混淆。此外,从0.10.0开始,现在支持Python 3,还包含了其他功能/错误修复。请参阅CHANGELOG以获取更改的更完整列表。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分布

netifaces-0.11.0.tar.gz (30.1 kB 查看哈希值)

上传时间:

构建分布

netifaces-0.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl (32.7 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl (32.1 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp39-cp39-macosx_11_0_arm64.whl (12.5 kB 查看哈希值)

上传时间: CPython 3.9 macOS 11.0+ ARM64

netifaces-0.11.0-cp39-cp39-macosx_10_15_x86_64.whl (12.3 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.15+ x86-64

netifaces-0.11.0-cp38-cp38-win_amd64.whl (16.4 kB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

netifaces-0.11.0-cp38-cp38-win32.whl (15.2 kB 查看哈希值)

上传于 CPython 3.8 Windows x86

netifaces-0.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl (33.9 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl (33.2 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp38-cp38-macosx_10_15_x86_64.whl (12.3 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.15+ x86-64

netifaces-0.11.0-cp37-cp37m-win_amd64.whl (16.3 kB 查看哈希值)

上传于 CPython 3.7m Windows x86-64

netifaces-0.11.0-cp37-cp37m-win32.whl (15.0 kB 查看哈希值)

上传于 CPython 3.7m Windows x86

netifaces-0.11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (32.7 kB 查看哈希值)

上传于 CPython 3.7m manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl (32.1 kB 查看哈希值)

上传于 CPython 3.7m manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp37-cp37m-macosx_10_15_x86_64.whl (12.2 kB 查看哈希值)

上传于 CPython 3.7m macOS 10.15+ x86-64

netifaces-0.11.0-cp36-cp36m-win_amd64.whl (16.3 kB 查看哈希值)

上传时间 CPython 3.6m Windows x86-64

netifaces-0.11.0-cp36-cp36m-win32.whl (15.0 kB 查看哈希值)

上传时间 CPython 3.6m Windows x86

netifaces-0.11.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (32.7 kB 查看哈希值)

上传时间 CPython 3.6m manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl (32.1 kB 查看哈希值)

上传时间 CPython 3.6m manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp36-cp36m-macosx_10_15_x86_64.whl (12.2 kB 查看哈希值)

上传时间 CPython 3.6m macOS 10.15+ x86-64

netifaces-0.11.0-cp35-cp35m-win32.whl (15.0 kB 查看哈希值)

上传时间 CPython 3.5m Windows x86

netifaces-0.11.0-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (32.7 kB 查看哈希值)

上传时间 CPython 3.5m manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl (32.1 kB 查看哈希值)

上传时间 CPython 3.5m manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp34-cp34m-win32.whl (13.5 kB 查看哈希值)

上传时间 CPython 3.4m Windows x86

netifaces-0.11.0-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl (31.4 kB 查看哈希值)

上传时间 CPython 2.7mu manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl (30.7 kB 查看哈希值)

上传时间: CPython 2.7mu manylinux: glibc 2.5+ i686

netifaces-0.11.0-cp27-cp27m-win_amd64.whl (13.8 kB 查看哈希值)

上传时间: CPython 2.7m Windows x86-64

netifaces-0.11.0-cp27-cp27m-win32.whl (13.6 kB 查看哈希值)

上传时间: CPython 2.7m Windows x86

netifaces-0.11.0-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl (31.4 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ x86-64

netifaces-0.11.0-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl (30.7 kB 查看哈希值)

上传时间: CPython 2.7m manylinux: glibc 2.5+ i686

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面