Finding local IP addresses using Python's stdlib Finding local IP addresses using Python's stdlib python python

Finding local IP addresses using Python's stdlib

I just found this but it seems a bit hackish, however they say tried it on *nix and I did on windows and it worked.

import sockets = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.connect(("", 80))print(s.getsockname()[0])s.close()

This assumes you have an internet access, and that there is no local proxy.

import socketsocket.gethostbyname(socket.gethostname())

This won't work always (returns on machines having the hostname in /etc/hosts as, a paliative would be what gimel shows, use socket.getfqdn() instead. Of course your machine needs a resolvable hostname.

This method returns the "primary" IP on the local box (the one with a default route).

  • Does NOT need routable net access or any connection at all.
  • Works even if all interfaces are unplugged from the network.
  • Does NOT need or even try to get anywhere else.
  • Works with NAT, public, private, external, and internal IP's
  • Pure Python 2 (or 3) with no external dependencies.
  • Works on Linux, Windows, and OSX.

Python 3 or 2:

import socketdef get_ip():    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)    try:        # doesn't even have to be reachable        s.connect(('', 1))        IP = s.getsockname()[0]    except Exception:        IP = ''    finally:        s.close()    return IP

This returns a single IP which is the primary (the one with a default route). If you need instead all IP's attached to all interfaces (including localhost, etc), see this answer.

If you are behind a NAT firewall like your wifi box at home, then this will not show your public NAT IP, but instead your private IP on the local network which has a default route to your local WIFI router; getting your wifi router's external IP would either require running this on THAT box, or connecting to an external service such as that could reflect back the IP... but that is completely different from the original question. :)