2012-07-31 3 views
10

Eventuali duplicati:
Finding local IP addresses using Python's stdlibPython - Get IP localhost

per ottenere il mio indirizzo IP localhost faccio socket.gethostbyname(socket.gethostname()). Ma mi dà la risposta 127.0.0.1. Se faccio an_existing_socket.getsockname()[0] ottengo la risposta 0.0.0.0.

Ho bisogno del mio indirizzo IP "reale" (ad esempio 192.168.x.x) per modificare un file di configurazione. Come posso averlo?

+0

@BigYellowCactus Hai ragione, guarderò queste risposte – VGO

+0

@Germann Arlington Questo file di configurazione è destinato ad essere utilizzato su un altro host: ** 1). Aggiorno il file conf ** con il mio IP e ** 2). Lancio ** remotamente un'applicazione che utilizza questo file conf. Per diversi motivi, non posso avere alcun controllo sull'host remoto all'avvio dell'applicazione. – VGO

+0

@ Vaïk Godard - in questo caso la soluzione migliore è indirizzarla per nome e lasciare che il DNS di rete lo risolva all'indirizzo. –

risposta

25

io in genere di questo codice:

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 

non so la sua origine, ma funziona su Linux/Windows.

Edit:

Questo codice è used da smerlin in this StackOverflow questione.

+0

'fcntl' non è una libreria python standard. – IAbstract

+0

e questa è una soluzione molto più breve: http://stackoverflow.com/a/25850698/210709 – IAbstract

+0

in esecuzione, +1 :-) – ddlab

14

C'è un modulo elegante che è possibile utilizzare. Si chiama netifaces. Basta fare una pip installare netifaces in un virtualenv per il test e provare il seguente codice:

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

Tutto dipende dal proprio ambiente. Se si dispone di una sola interfaccia con un unico indirizzo IP collegato ad esso, si può semplicemente fare:

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

Se sei dietro un NAT e volete conoscere il vostro indirizzo IP pubblico, si può usare qualcosa di simile:

import urllib2 

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

Spero che questo aiuti.