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(("184.108.40.206", 80))print(s.getsockname())s.close()
This assumes you have an internet access, and that there is no local proxy.
This won't work always (returns
127.0.0.1 on machines having the hostname in
127.0.0.1), 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(('10.255.255.255', 1)) IP = s.getsockname() except Exception: IP = '127.0.0.1' 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 whatismyip.com/whatismyipaddress.com that could reflect back the IP... but that is completely different from the original question. :)