Python – Obtener localhost IP

Posible duplicado:
Encontrar direcciones IP locales usando el stdlib de Python

Para obtener mi dirección IP de localhost hago socket.gethostbyname(socket.gethostname()) . Pero me da la respuesta 127.0.0.1 . Si hago an_existing_socket.getsockname()[0] obtengo la respuesta 0.0.0.0 .

Necesito mi dirección IP “real” (por ejemplo, 192.168.xx) para modificar un archivo de configuración. ¿Cómo podría conseguirlo?

Generalmente uso este código:

 import os import socket if os.name != "nt": import fcntl import struct def get_interface_ip(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24]) def get_lan_ip(): ip = socket.gethostbyname(socket.gethostname()) if ip.startswith("127.") and os.name != "nt": interfaces = [ "eth0", "eth1", "eth2", "wlan0", "wlan1", "wifi0", "ath0", "ath1", "ppp0", ] for ifname in interfaces: try: ip = get_interface_ip(ifname) break except IOError: pass return ip 

No sé su origen, pero funciona en Linux / Windows.

Editar:

Este código es utilizado por smerlin en esta pregunta de stackoverflow.

Hay un módulo ingenioso que puedes usar. Se llama netifaces. Simplemente haga un pip instale los netifaces en un virtualenv para probarlos y pruebe el siguiente código:

 import netifaces interfaces = netifaces.interfaces() for i in interfaces: if i == 'lo': continue iface = netifaces.ifaddresses(i).get(netifaces.AF_INET) if iface != None: for j in iface: print j['addr'] 

Todo depende de tu entorno. Si solo tiene una interfaz con una dirección IP adjunta, simplemente puede hacer:

 netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr'] 

Si está detrás de un NAT y desea conocer su dirección IP pública, puede usar algo como:

 import urllib2 ret = urllib2.urlopen('https://enabledns.com/ip') print ret.read() 

Espero que esto ayude.