便携式网络接口信息。
项目描述
原始致谢
此软件包不是我的。原始代码的全部荣誉归功于Alastair Houghton [alastair AT alastairs-place DOT net] 的netifaces软件包。还应感谢Kevin Kelley [kelleyk AT kelleyk D0T net],他负责将原始的netifaces代码移植到Python 3.x并创建了netifaces-py3软件包。
有何不同
此软件包是从https://github.com/kelleyk/py3k-netifaces分叉的,并进行了少量修改。这些更改包括
遵循标准主.次.微命名规范的版本号。
更新setup.py,修复了一些与Python 2.5相关的问题(原始软件包支持Python 2.5)
删除了minisix作为依赖项
从https://gist.github.com/opalmer/6558607合并的代码,该代码修复了在Windows上编译时的一个错误。此补丁已提交给原始的netifaces作者,但从未得到回复。
创建此软件包的原因
通常,当遇到开源Python软件包问题时,应向作者提交补丁,进行审核,然后最终合并。然而,有时这并不会发生,出于某种原因,软件包会被复制、修复,并以另一个名称发布。
那么为什么创建netifaces-merged?我创建此软件包有几个原因,但总的来说,原因是为了跨平台稳定性,并且可以在Python版本之间使用单个软件包,而无需外部依赖。
在尝试完成这项任务时,第一个问题是netifaces库存在一个错误,这破坏了Windows编译。我曾就这个问题给作者发过邮件,并附上了补丁,但不幸的是,我从未收到回复。虽然有一些绕过它的方法,比如在运行我的setup.py文件时对源代码进行猴子补丁,但我认为这也不是一个很好的解决方案,无论是对于我自己的库还是对于将来使用netifaces的任何人。
快进几个月,我开始将我的部分库转换为Python 3.x。不幸的是,netifaces仍然没有更新,但有人,感谢Kevin Kelley,足够好地将它移植到Python 3。这次的问题是setup.py不是为旧版本的Python设计的,而且依赖于一个模块,截至本文写作时,它还不存在于PyPi中,也没有与netifaces-py3一起打包。除此之外,PyPi中现有的包被认为是一个愚蠢的二进制包,使用pip无法安装到虚拟环境中。
我欢迎将我的工作和Kevin的工作合并到netifaces中,但在那之前,我将维护这个包一段时间。
netifaces 0.9.0
1. 这是啥?
有一段时间我一直很烦恼,因为没有简单的方法可以从Python中获取机器网络接口的地址。这个问题很难解决,因为几乎不可能以可移植的方式完成。然而,在我看来,应该有一个包,你可以通过easy_install安装它,它会处理你正在使用的机器上的细节,然后你可以继续编写Python代码,而不必关心系统依赖的低级网络API的繁琐细节。
这个包试图解决这个问题。
2. 我怎么使用它?
首先,你需要安装它,你可以通过以下命令来完成
tar xvzf netifaces-0.4.tar.gz cd netifaces-0.4 python setup.py install
完成这些后,你需要启动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'}]
你可能想知道为什么这个值是列表。原因是接口可能有多个地址,甚至在同一族中。我再重复一遍:你可以将多个相同类型的地址与每个接口关联起来。
请求特定接口的“地址”是没有意义的。
好吧,所以,我们可以看到这个特定的接口只有一个地址,而且因为它是一个环回接口,所以它是点对点,因此有一个对等地址而不是广播地址。
让我们看看一个更有趣的接口。
>>> 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地址,而不是IP地址;即运行此接口的以太网适配器的硬件地址。我们可以这样做
>>> 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地址。
3. 它在哪些平台上工作?
嗯,看这里,事情是这样的。它在Mac OS X上进行了测试,并且似乎可以正常工作。(OS X方便地提供了一些SIOCGIFxxx ioctl(),这意味着它们中的大多数也已经过测试,唯一的明显例外是SIOCGIFHWADDR ioctl(),OS X根本就没有这个。)
它可能在大多数其他相对较小的UNIX-like系统上正常工作。如果您确实需要更改某些内容,请发送给我,邮箱地址为 <alastair AT alastairs-place.net>,我会看看是否可以将其合并。
它也在Windows上运行得很好,使用GetAdaptersInfo()函数。请注意,但在Windows上,目前无法检索IPv6地址。我目前没有使用Windows,所以这不是我的优先事项。如果您知道如何修复它,请给我发邮件,我会考虑添加必要的代码。
4. 这个软件的许可证是什么?
这是一个MIT风格的许可证。以下是内容
特此授予任何人获取本软件及其相关文档文件(“软件”)副本的许可,免费使用软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许获得软件的人这样做,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论是否因合同、侵权或其他行为而产生,与软件或其使用或其他交易有关。
项目详情
下载文件
下载适用于您平台文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。
源分布
构建分发
netifaces-merged-0.9.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a3b9e175f0b101be1ccd0146476ae61b09b89b5edd75d31bbaf96c75a7d0dc99 |
|
MD5 | f649b7a3cf69cb7bc3e6f15f72d44bcc |
|
BLAKE2b-256 | 5d65afaea4b9a48cdfa1f512c82be3871582faeb709a9055bbabfa8049a38459 |
哈希值 for netifaces_merged-0.9.0-py3.3-macosx-10.9-x86_64.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ac02c24551669727f01c8f8e8af69527c9cc8362d75e4b66a72f9d6f34ee14d1 |
|
MD5 | 8bb39ca3beae018f0bb47dc242c3dd3c |
|
BLAKE2b-256 | fa282502a503522d61ed898633210a1b5f48eb954b3f7beff7b4b45564077c9c |
哈希值 for netifaces_merged-0.9.0-py3.3-linux-x86_64.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4bcd697b6126685b61a5c716b8afef86a03f1fb17d510541a507c64c079d1653 |
|
MD5 | 269c66235a25e83509b0cbdc2dab28e9 |
|
BLAKE2b-256 | 59d54ab988067b23f048903181111fe57eb7ab0cf411815f7273e756e4b31931 |
哈希值 for netifaces_merged-0.9.0-py2.7-macosx-10.9-intel.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2e2902f8b81fb62826a044cd9d0e8b4a02bc8ed088d2c74727fc9f58f7fdf3a7 |
|
MD5 | f2c0a0652d166438aa0d3a8d8d3787b2 |
|
BLAKE2b-256 | 0c6049cf3690fafcf9b504b47700670b770626d32f17b2feba43f5138a4bffc5 |
哈希值 for netifaces_merged-0.9.0-py2.7-linux-x86_64.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4007eea8ba446403a545d4a9bd14a3b3c4926aefadf01797335ee6706e511b51 |
|
MD5 | e8d30ab9d52c4b0cba8f78c15fd7cfe6 |
|
BLAKE2b-256 | b195956cf85e1e2fee792b0f0c3d4b28ca406693372d124263a073c22a21cb37 |
哈希值 for netifaces_merged-0.9.0-py2.6-macosx-10.9-intel.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 08cf2583c10a23595458ef672404377ee65a5b71c7b04fa0c2cc7990032e3428 |
|
MD5 | 30719b6b37e5afb7d5d6cae11d2f134b |
|
BLAKE2b-256 | b57fba62490881f1094406f98c76c73211f20748dcd332b66698d9a994b98915 |
哈希值 for netifaces_merged-0.9.0-py2.6-linux-x86_64.egg
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4ff742f700b61b9b02aada7eeec401cff56c337fc9fcc2d13209803dd962a974 |
|
MD5 | a1283bc8f561a90565aecf2865ec9541 |
|
BLAKE2b-256 | 72c6e28bea02f78288503e2f67bb4f860904825274e972cf6808c83517031b60 |