Wie bekomme ich die IP-Adresse von eth0 in Python?

Wenn ein Fehler in einem Python-Skript auf Unix auftritt, wird eine E-Mail gesendet.

Ich wurde gebeten, der Betreffzeile der E-Mail {Testing Environment} hinzuzufügen, wenn die IP-Adresse 192.168.100.37 ist, welches der Test-Server ist. Auf diese Weise können wir eine Version eines Skripts und eine Möglichkeit haben zu sagen, ob die E-Mail von verpassten Daten auf dem Test-Server kommt.

Allerdings, wenn ich google Ich finde diesen Code:

import socket socket.gethostbyname(socket.gethostname()) 

Das gibt mir aber die IP-Adresse von 127.0.1.1. Wenn ich ifconfig bekomme ich das

 eth0 Link encap:Ethernet HWaddr 00:1c:c4:2c:c8:3e inet addr:192.168.100.37 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:75760697 errors:0 dropped:411180 overruns:0 frame:0 TX packets:23166399 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:59525958247 (59.5 GB) TX bytes:10142130096 (10.1 GB) Interrupt:19 Memory:f0500000-f0520000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:25573544 errors:0 dropped:0 overruns:0 frame:0 TX packets:25573544 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:44531490070 (44.5 GB) TX bytes:44531490070 (44.5 GB) 

Zuerst weiß ich nicht wo es 127.0.1.1 bekommen hat, aber irgendwie ist das nicht was ich will Wenn ich google Ich komme immer auf die gleiche Syntax, Bash Scripts oder Netifaces und ich versuche, Standard-Bibliotheken zu verwenden.

Also, wie bekomme ich die IP-Adresse von eth0 in Python?

8 Solutions collect form web for “Wie bekomme ich die IP-Adresse von eth0 in Python?”

Zwei Methoden:

Methode # 1 (externes Paket verwenden)

Sie müssen nach der IP-Adresse fragen, die an Ihre eth0 Schnittstelle gebunden ist. Dies ist aus dem netifaces Paket erhältlich

 import netifaces as ni ni.ifaddresses('eth0') ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr'] print ip # should print "192.168.100.37" 

Sie können auch eine Liste aller verfügbaren Schnittstellen über erhalten

 ni.interfaces() 

Methode # 2 (kein externes Paket)

Hier ist ein Weg, um die IP-Adresse ohne ein Python-Paket zu bekommen:

 import socket import fcntl import struct def get_ip_address(ifname): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) return socket.inet_ntoa(fcntl.ioctl( s.fileno(), 0x8915, # SIOCGIFADDR struct.pack('256s', ifname[:15]) )[20:24]) get_ip_address('eth0') # '192.168.0.110' 

Hinweis: Erkennung der IP-Adresse, um festzustellen, welche Umgebung Sie verwenden, ist ziemlich hack. Fast alle Frameworks bieten eine sehr einfache Möglichkeit, eine Umgebungsvariable einzustellen / zu modifizieren, um die aktuelle Umgebung anzuzeigen. Versuchen Sie, sich diese Dokumentation anzusehen. Es sollte so einfach sein wie zu tun

 if app.config['ENV'] == 'production': #send production email else: #send development email 

Alternativ, wenn Sie die IP-Adresse von welcher Schnittstelle verwendet werden möchten, um eine Verbindung zum Netzwerk herzustellen, ohne ihren Namen kennen zu müssen, können Sie dies verwenden:

 import socket def get_ip_address(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) return s.getsockname()[0] 

Ich weiß, es ist ein wenig anders als deine Frage, aber andere können hier ankommen und finden diese noch nützlicher. Sie müssen nicht eine Route zu 8.8.8.8 haben, um diese zu verwenden. Alles, was es tut, öffnet eine Steckdose, aber nicht verbinden.

Wenn Sie nur auf Unix arbeiten müssen, können Sie einen Systemaufruf verwenden (ref. Stack Overflow Frage Parse ifconfig, um nur meine IP-Adresse mit Bash zu erhalten ):

 import os f = os.popen('ifconfig eth0 | grep "inet\ addr" | cut -d: -f2 | cut -d" " -f1') your_ip=f.read() 

Da die meisten Antworten ifconfig , um das IPv4 aus der eth0-Schnittstelle zu extrahieren, was zugunsten von ip addr veraltet ist, könnte stattdessen der folgende Code verwendet werden:

 import os ipv4 = os.popen('ip addr show eth0 | grep "\<inet\>" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip() ipv6 = os.popen('ip addr show eth0 | grep "\<inet6\>" | awk \'{ print $2 }\' | awk -F "/" \'{ print $1 }\'').read().strip() 

AKTUALISIEREN:

Alternativ können Sie einen Teil der Parsing-Aufgabe an den Python-Interpreter verschieben, indem Sie split() anstelle von grep und awk verwenden, da @serg in den Kommentar hinweist:

 import os ipv4 = os.popen('ip addr show eth0').read().split("inet ")[1].split("/")[0] ipv6 = os.popen('ip addr show eth0').read().split("inet6 ")[1].split("/")[0] 

Aber in diesem Fall müssen Sie die Grenzen des Arrays überprüfen, das von jedem split() Aufruf zurückgegeben wird.

UPDATE 2:

Eine andere Version mit Regex:

 import os import re ipv4 = re.search(re.compile(r'(?<=inet )(.*)(?=\/)', re.M), os.popen('ip addr show eth0').read()).groups()[0] ipv6 = re.search(re.compile(r'(?<=inet6 )(.*)(?=\/)', re.M), os.popen('ip addr show eth0').read()).groups()[0] 

Ein einfacher Ansatz, der einen String mit ip-Adressen für die Schnittstellen zurückgibt, ist:

 from subprocess import check_output ips = check_output(['hostname', '--all-ip-addresses']) 

Für weitere Infos siehe Hostname .

Versuchen Sie unten Code, es funktioniert für mich in Mac10.10.2:

 import subprocess if __name__ == "__main__": result = subprocess.check_output('ifconfig en0 |grep -w inet', shell=True) # you may need to use eth0 instead of en0 here!!! print 'output = %s' % result.strip() # result = None ip = '' if result: strs = result.split('\n') for line in strs: # remove \t, space... line = line.strip() if line.startswith('inet '): a = line.find(' ') ipStart = a+1 ipEnd = line.find(' ', ipStart) if a != -1 and ipEnd != -1: ip = line[ipStart:ipEnd] break print 'ip = %s' % ip 

Finden Sie die IP-Adresse des ersten Eth / Wlan-Eintrags in ifconfig, der RUNNING ist:

 import itertools import os import re def get_ip(): f = os.popen('ifconfig') for iface in [' '.join(i) for i in iter(lambda: list(itertools.takewhile(lambda l: not l.isspace(),f)), [])]: if re.findall('^(eth|wlan)[0-9]',iface) and re.findall('RUNNING',iface): ip = re.findall('(?<=inet\saddr:)[0-9\.]+',iface) if ip: return ip[0] return False 

Es hat für mich gearbeitet

  import subprocess my_ip = subprocess.Popen(['ifconfig eth0 | awk "/inet /" | cut -d":" -f 2 | cut -d" " -f1'], stdout=subprocess.PIPE, shell=True) (IP,errors) = my_ip.communicate() my_ip.stdout.close() print IP 
  • Entfernen Sie alle Zeilen mit dem Wort NOT im Wörterbuch
  • Gibt es eine einfache Möglichkeit, das Python-Skript zu benennen?
  • Wie laufe ich Selen in Xvfb?
  • Wie bekomme ich die maximale Speicherauslastung eines Programms mit psutil in Python
  • Howto do python Befehlszeile Autovervollständigung aber NICHT nur am Anfang eines Strings
  • Erfassen des Status des Python-Prozesses in der UNIX-Shell
  • Erstellen Sie eine python-ausführbare Datei mit setuptools
  • Wie bekomme ich die Prozessliste in Python?
  • Python ist die beste Programmiersprache der Welt.