2012-07-31 28 views
10

Duplicar posibles:
Finding local IP addresses using Python's stdlibPython - Obtener localhost IP

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

Necesito mi dirección IP 'real' (por ejemplo, 192.168.x.x) para modificar un archivo de configuración. ¿Cómo podría obtenerlo?

+0

@BigYellowCactus Tienes razón, veré estas respuestas – VGO

+0

@Germann Arlington Este archivo de configuración está destinado a ser utilizado en otro host: ** 1). Actualizo el archivo conf ** con mi IP y ** 2). Lanzo ** de forma remota una aplicación que usa este archivo conf. Por varias razones, no puedo tener ningún control sobre el host remoto cuando se inicia la aplicación. – VGO

+0

@ Vaïk Godard: en este caso, la mejor solución es abordarlo por su nombre y dejar que el DNS de la red lo resuelva en la dirección. –

Respuesta

25

que suelen utilizar 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 used por smerlin en this cuestión stackoverflow.

+0

'fcntl' no es una biblioteca de python estándar. – IAbstract

+0

y esta es una solución mucho más corta: http://stackoverflow.com/a/25850698/210709 – IAbstract

+0

saliendo de la caja, +1 :-) – ddlab

14

Hay un módulo ingenioso que puede usar. Se llama netifaces. Sólo hacer un pip instalar netifaces en un virtualenv para probar y probar 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 su entorno. Si sólo tiene una interfaz con una dirección IP que se le atribuye, sólo tiene que hacer:

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

Si estás detrás de un NAT y quiere saber su dirección IP pública, puede utilizar algo como:

import urllib2 

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

Espero que esto ayude.

Cuestiones relacionadas