2012-07-31 21 views
10

Olası Çoğalt:
Finding local IP addresses using Python's stdlibPython - Get localhost IP

ben socket.gethostbyname(socket.gethostname()) yapmak benim localhost IP adresini almak için. Ama bana 127.0.0.1 cevabı veriyor. an_existing_socket.getsockname()[0] yaparsam 0.0.0.0 cevabını alırım.

Bir yapılandırma dosyasını değiştirmek için 'gerçek' ip adresime ihtiyacım var (örneğin 192.168.x.x). Nasıl alabilirim?

+0

@BigYellowCactus Haklısınız, şu yanıtlara bakacağım – VGO

+0

@Germann Arlington Bu yapılandırma dosyası başka bir bilgisayarda kullanılmak üzere tasarlanmıştır: ** 1). IP dosyasını ** ve IP 2 ile güncelliyorum. Bu conf dosyasını kullanan bir uygulamayı uzaktan başlatıyorum. Birkaç nedenden ötürü, uygulama başlatıldığında uzak ana bilgisayarda herhangi bir kontrol gerçekleştiremem. – VGO

+0

@ Vaïk Godard - bu durumda en iyi çözüm, ismiyle adreslemek ve ağ DNS'nin adrese çözmesine izin vermek. –

cevap

25

Genellikle bu kodu kullanın:

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 

Bunun kökeni bilmiyorum ama Linux/Windows üzerinde çalışır.

Düzenleme:

Bu kod smerlinthis yılında stackoverflow soru tarafından used olduğunu.

+0

'fcntl' standart bir python kitaplığı değil. – IAbstract

+0

ve bu çok daha kısa bir çözüm: http://stackoverflow.com/a/25850698/210709 – IAbstract

+0

kutunun dışında çalışan, +1 :-) – ddlab

14

Kullanabileceğiniz şık bir modül var. Onun adı verilen netifaces. Sadece bir pip test için bir virtualenv içine netifaces yükleyip aşağıdaki kodu deneyin:

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

Tüm ortamınıza bağlıdır. Yalnızca kendisine bağlı bir IP adresiyle bir arayüze varsa, basitçe yapabilirsiniz:

: Bir NAT arkasında ve genel IP adresini bilmek istiyorsanız

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

, gibi bir şey kullanabilirsiniz

import urllib2 

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

Bu yardımcı olur umarım.