2012-07-31 18 views
10

संभव डुप्लिकेट:
Finding local IP addresses using Python's stdlibअजगर - जाओ स्थानीय होस्ट आईपी

मेरी स्थानीय होस्ट आईपी पते प्राप्त करने के लिए मैं socket.gethostbyname(socket.gethostname()) है। लेकिन यह मुझे जवाब देता है 127.0.0.1। अगर मैं an_existing_socket.getsockname()[0] मैं जवाब 0.0.0.0 मिलता है।

मैं अपने 'असली' आईपी पते (उदाहरण के 192.168.x.x के लिए) की जरूरत है एक विन्यास फाइल को संशोधित करने के। मैं इसे कैसे प्राप्त कर सकता हूं?

+0

@BigYellowCactus आप सही हैं, मैं इन उत्तरों को देखूंगा – VGO

+0

@Germann Arlington यह कॉन्फ़िगरेशन फ़ाइल किसी अन्य होस्ट पर उपयोग की जाने वाली है: ** 1)। मैं अपने आईपी और ** 2 के साथ conf फ़ाइल ** अद्यतन)। मैं ** दूरस्थ रूप से एक एप्ली लॉन्च करता हूं जो इस conf फ़ाइल का उपयोग करता है। कई कारणों से, एप्पल लॉन्च होने पर रिमोट होस्ट पर मेरा कोई नियंत्रण नहीं हो सकता है। – VGO

+0

@ Vaik गोडार्ड - इस मामले में सबसे अच्छा समाधान नाम से यह पता और नेटवर्क DNS पता करने के लिए इसे हल करने देने के लिए है। –

उत्तर

25

मैं आम तौर पर इस कोड का उपयोग:

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 

मैं इसे मूल है पता नहीं है, लेकिन यह लिनक्स/विंडोज पर काम करता है।

संपादित करें:

इस कोड smerlinthis में stackoverflow सवाल से used है।

+0

'fcntl' एक मानक अजगर पुस्तकालय नहीं है। – IAbstract

+0

और यह एक बहुत छोटा समाधान है: http://stackoverflow.com/a/25850698/210709 – IAbstract

+0

बॉक्स से बाहर चल रहा है, +1 :-) – ddlab

14

एक गंधा मॉड्यूल का उपयोग कर सकते है। इसे नेटिफेस कहा जाता है। बस एक पिप के परीक्षण के लिए एक virtualenv में netifaces स्थापित करें और निम्नलिखित कोड की कोशिश करते हैं:

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

यह सब अपने वातावरण पर निर्भर करता है। आप केवल एक आईपी इसे से जुड़े पते के साथ एक इंटरफेस है, तो आप बस कर सकते हैं:

:

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

आप एक नेट के पीछे हैं और अपने सार्वजनिक आईपी पते जानना चाहते हैं, तो आप की तरह कुछ का उपयोग कर सकते

import urllib2 

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

आशा इस मदद करता है।

संबंधित मुद्दे