Skip to main content

Portable network interface information.

Project description

Original Credits

This package is not my own. Full credit for the original code goes to Alastair Houghton [alastair AT alastairs-place DOT net] for his netifaces package. Credit also goes to Kevin Kelley [kelleyk AT kelleyk D0T net] for porting the original netifaces code to Python 3.x and creating the netifaces-py3 package.

What’s Different

This package is a fork from https://github.com/kelleyk/py3k-netifaces with minor changes. These changes include:

  • A version number that follows the standard major.minor.micro naming spec.

  • Update to setup.py which fixes some issues with Python 2.5 (the original package support Python 2.5

  • Removal of minisix as a dependency

  • merged code from https://gist.github.com/opalmer/6558607 which fixes a bug during compilation on Windows. This patch was submitted to the original author of netifaces but was never responded to.

Why This Package Was Created

Normally when problems are encountered in open source Python packages you should submit a patch to the author, have it reviewed, and then finally merged. Sometimes this doesn’t happen however and for one reason or another the package is replicated, fixed, and then released under another name.

So why was netifaces-merged created? There are a few reasons why I’ve created this package but overall the reasons are cross-platform stability and so that a single package can be used across Python versions without the need for external dependencies.

The first problem when trying to accomplish this was that netifaces contained a bug which broke the Windows build. I emailed the author about it and included a patch but unfortunately never received a reply back. Although there were ways to work around it, such as monkey patching the source when running one of my setup.py files, I didn’t think this was a great solution either for my own libraries or for anyone else using netifaces in the future.

Fast forward a few more months and I started working on converting some of my libraries to Python 3.x. netifaces still had not been updated unfortunately but someone, thank you Kevin Kelley, was nice enough to port it to Python 3. The problem this time was the setup.py wasn’t designed to operate in older versions of Python and also relied on a module that as of this writing didn’t exist in PyPi and was not package with netifaces-py3. In addition to this the existing package in PyPi, which is classed as a dumb binary, failed to install into a virtual environment using pip.

I welcome the opportunity to merge both my work and Kevin’s into netifaces but until that happens I’ll be maintaining this package for the foreseeable future.

netifaces 0.9.0

1. What is this?

It’s been annoying me for some time that there’s no easy way to get the address(es) of the machine’s network interfaces from Python. There is a good reason for this difficulty, which is that it is virtually impossible to do so in a portable manner. However, it seems to me that there should be a package you can easy_install that will take care of working out the details of doing so on the machine you’re using, then you can get on with writing Python code without concerning yourself with the nitty gritty of system-dependent low-level networking APIs.

This package attempts to solve that problem.

2. How do I use it?

First you need to install it, which you can do by typing

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

Once that’s done, you’ll need to start Python and do something like the following:

>>> import netifaces

Then if you enter

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

you’ll see the list of interface identifiers for your machine.

You can ask for the addresses of a particular interface by doing

>>> 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'}]}

Hmmmm. That result looks a bit cryptic; let’s break it apart and explain what each piece means. It returned a dictionary, so let’s look there first:

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

Each of the numbers refers to a particular address family. In this case, we have three address families listed; on my system, 18 is AF_LINK (which means the link layer interface, e.g. Ethernet), 2 is AF_INET (normal Internet addresses), and 30 is AF_INET6 (IPv6).

But wait! Don’t use these numbers in your code. The numeric values here are system dependent; fortunately, I thought of that when writing netifaces, so the module declares a range of values that you might need. e.g.

>>> netifaces.AF_LINK
18

Again, on your system, the number may be different.

So, what we’ve established is that the dictionary that’s returned has one entry for each address family for which this interface has an address. Let’s take a look at the AF_INET addresses now:

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

You might be wondering why this value is a list. The reason is that it’s possible for an interface to have more than one address, even within the same family. I’ll say that again: you can have more than one address of the same type associated with each interface.

Asking for “the” address of a particular interface doesn’t make sense.

Right, so, we can see that this particular interface only has one address, and, because it’s a loopback interface, it’s point-to-point and therefore has a peer address rather than a broadcast address.

Let’s look at a more interesting interface.

>>> 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'}]

This interface has two addresses (see, I told you…) Both of them are regular IPv4 addresses, although in one case the netmask has been changed from its default. The netmask may not appear on your system if it’s set to the default for the address range.

Because this interface isn’t point-to-point, it also has broadcast addresses.

Now, say we want, instead of the IP addresses, to get the MAC address; that is, the hardware address of the Ethernet adapter running this interface. We can do

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

Note that this may not be available on platforms without getifaddrs(), unless they happen to implement SIOCGIFHWADDR. Note also that you just get the address; it’s unlikely that you’ll see anything else with an AF_LINK address. Oh, and don’t assume that all AF_LINK addresses are Ethernet; you might, for instance, be on a Mac, in which case:

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

No, that isn’t an exceptionally long Ethernet MAC address—it’s a FireWire address.

3. This is great! What platforms does it work on?

Well, see, here’s the thing. It’s been tested on Mac OS X, and it seems to work. (OS X helpfully has some of the SIOCGIFxxx ioctl()s, which means that most of those have been tested too, the only glaring exception being the SIOCGIFHWADDR ioctl(), which OS X just doesn’t have.)

It should probably work on most of the other UNIX-like systems with relatively minor changes. If you do have to change something, send it to me at <alastair AT alastairs-place.net> and I’ll see if I can merge it in.

It also works just fine on Windows, using the GetAdaptersInfo() function. Note, though, that on Windows it isn’t possible (yet) to retrieve IPv6 addresses. I don’t use Windows at the moment, so this isn’t a priority for me. If you know how to fix it, drop me a line and I’ll consider adding any necessary code.

4. What license is this under?

It’s an MIT-style license. Here goes:

Copyright (c) 2007, 2008 Alastair Houghton
Copyright (c) 2011 Kevin Kelley
Copyright (c) 2013 Oliver Palmer

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

netifaces-merged-0.9.0.tar.gz (21.8 kB view details)

Uploaded Source

Built Distributions

netifaces_merged-0.9.0-py3.3-win32.egg (12.9 kB view details)

Uploaded Source

netifaces_merged-0.9.0-py3.3-linux-x86_64.egg (21.6 kB view details)

Uploaded Source

netifaces_merged-0.9.0-py2.7-win32.egg (12.2 kB view details)

Uploaded Source

netifaces_merged-0.9.0-py2.7-linux-x86_64.egg (21.2 kB view details)

Uploaded Source

netifaces_merged-0.9.0-py2.6-win32.egg (12.5 kB view details)

Uploaded Source

netifaces_merged-0.9.0-py2.6-linux-x86_64.egg (21.1 kB view details)

Uploaded Source

netifaces-merged-0.9.0.win32-py3.3.exe (213.8 kB view details)

Uploaded Source

netifaces-merged-0.9.0.win32-py2.7.exe (218.3 kB view details)

Uploaded Source

netifaces-merged-0.9.0.win32-py2.6.exe (218.5 kB view details)

Uploaded Source

File details

Details for the file netifaces-merged-0.9.0.tar.gz.

File metadata

File hashes

Hashes for netifaces-merged-0.9.0.tar.gz
Algorithm Hash digest
SHA256 a3b9e175f0b101be1ccd0146476ae61b09b89b5edd75d31bbaf96c75a7d0dc99
MD5 f649b7a3cf69cb7bc3e6f15f72d44bcc
BLAKE2b-256 5d65afaea4b9a48cdfa1f512c82be3871582faeb709a9055bbabfa8049a38459

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py3.3-win32.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py3.3-win32.egg
Algorithm Hash digest
SHA256 4271d3536e0605e6e2b543dbed91afe90f8d56efe7eeca75eefcecaf5987bcd4
MD5 99c8984641044f0b1453bce84d2f835f
BLAKE2b-256 7aa7ea0a131e1bd52d4aabc8f4096063cb729b337d792b70ab42355c7ac38d9d

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py3.3-macosx-10.9-x86_64.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py3.3-macosx-10.9-x86_64.egg
Algorithm Hash digest
SHA256 ac02c24551669727f01c8f8e8af69527c9cc8362d75e4b66a72f9d6f34ee14d1
MD5 8bb39ca3beae018f0bb47dc242c3dd3c
BLAKE2b-256 fa282502a503522d61ed898633210a1b5f48eb954b3f7beff7b4b45564077c9c

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py3.3-linux-x86_64.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py3.3-linux-x86_64.egg
Algorithm Hash digest
SHA256 4bcd697b6126685b61a5c716b8afef86a03f1fb17d510541a507c64c079d1653
MD5 269c66235a25e83509b0cbdc2dab28e9
BLAKE2b-256 59d54ab988067b23f048903181111fe57eb7ab0cf411815f7273e756e4b31931

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.7-win32.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.7-win32.egg
Algorithm Hash digest
SHA256 360a229c50282c2cf259b232dd6be0d4d3c85463485c5b0de5d4a156358c0f04
MD5 13b5f8124bfc5ffbd3cd3d7c18764b65
BLAKE2b-256 ef8eb9ffd9a89ffafe121f05cfa291f64ef1645655ea055bb77032e3df9634c6

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.7-macosx-10.9-intel.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.7-macosx-10.9-intel.egg
Algorithm Hash digest
SHA256 2e2902f8b81fb62826a044cd9d0e8b4a02bc8ed088d2c74727fc9f58f7fdf3a7
MD5 f2c0a0652d166438aa0d3a8d8d3787b2
BLAKE2b-256 0c6049cf3690fafcf9b504b47700670b770626d32f17b2feba43f5138a4bffc5

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.7-linux-x86_64.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.7-linux-x86_64.egg
Algorithm Hash digest
SHA256 4007eea8ba446403a545d4a9bd14a3b3c4926aefadf01797335ee6706e511b51
MD5 e8d30ab9d52c4b0cba8f78c15fd7cfe6
BLAKE2b-256 b195956cf85e1e2fee792b0f0c3d4b28ca406693372d124263a073c22a21cb37

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.6-win32.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.6-win32.egg
Algorithm Hash digest
SHA256 91a0aa0f5115d0e02769020805a4eb7a55652aa9acf7f2f167a7a11edf39225b
MD5 8f37e9ef8ec55fdfd91edcb5eee4f83e
BLAKE2b-256 afd0293126e85a16aee865e11510cd155aaabae6397244d209cdd1a610707da8

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.6-macosx-10.9-intel.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.6-macosx-10.9-intel.egg
Algorithm Hash digest
SHA256 08cf2583c10a23595458ef672404377ee65a5b71c7b04fa0c2cc7990032e3428
MD5 30719b6b37e5afb7d5d6cae11d2f134b
BLAKE2b-256 b57fba62490881f1094406f98c76c73211f20748dcd332b66698d9a994b98915

See more details on using hashes here.

File details

Details for the file netifaces_merged-0.9.0-py2.6-linux-x86_64.egg.

File metadata

File hashes

Hashes for netifaces_merged-0.9.0-py2.6-linux-x86_64.egg
Algorithm Hash digest
SHA256 4ff742f700b61b9b02aada7eeec401cff56c337fc9fcc2d13209803dd962a974
MD5 a1283bc8f561a90565aecf2865ec9541
BLAKE2b-256 72c6e28bea02f78288503e2f67bb4f860904825274e972cf6808c83517031b60

See more details on using hashes here.

File details

Details for the file netifaces-merged-0.9.0.win32-py3.3.exe.

File metadata

File hashes

Hashes for netifaces-merged-0.9.0.win32-py3.3.exe
Algorithm Hash digest
SHA256 91712400ef7458f14f826b55715ceb49e76ccdf1953b07a19784dc52d0ac8e2d
MD5 91e616cfb9e2d71ccd22815b518ff5e0
BLAKE2b-256 2f489350e7faa71406919be5c026e5904b18f985cf94bcf20ea129827e020426

See more details on using hashes here.

File details

Details for the file netifaces-merged-0.9.0.win32-py2.7.exe.

File metadata

File hashes

Hashes for netifaces-merged-0.9.0.win32-py2.7.exe
Algorithm Hash digest
SHA256 fa2f0d5dbc07c59b28e6d02b4c38459db34baeda3f2654d45f1a75a8d69defee
MD5 2dd97e4fdbfbbf638baaa9b0c715fbdb
BLAKE2b-256 af05adf73933037ffa520948ff1041b36520eac3e7aab06a2f216e3cbc4e5f1f

See more details on using hashes here.

File details

Details for the file netifaces-merged-0.9.0.win32-py2.6.exe.

File metadata

File hashes

Hashes for netifaces-merged-0.9.0.win32-py2.6.exe
Algorithm Hash digest
SHA256 72e1154fbdfcdbb67dedcae9ff3b8e6913702a24584f3d95d33533053359a4cf
MD5 2107390c03235f24499bd7a36274e4a2
BLAKE2b-256 fcba646cf7fbc59e313e10d0b5687b86d3d9dd47896c6bf685a349b285c8ade4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page