Duplicata possible:
Recherche d'adresses IP locales à l'aide de stdlib de Python
Pour obtenir mon adresse IP localhost, je fais socket.gethostbyname(socket.gethostname())
. Mais cela me donne la réponse 127.0.0.1
. Si je fais an_existing_socket.getsockname()[0]
j'obtiens la réponse 0.0.0.0
.
J'ai besoin de ma "vraie" adresse IP (par exemple 192.168.x.x) pour modifier un fichier de configuration. Comment pourrais-je l'obtenir?
J'utilise généralement ce code:
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
Je ne sais pas si c'est Origin, mais cela fonctionne sous Linux/Windows.
Modifier:
Ce code est tilisé par smerlin dans this stackoverflow question.
Il existe un module astucieux que vous pouvez utiliser. Ses appelés netifaces. Faites simplement un pip install netifaces dans un virtualenv pour tester et essayez le code suivant:
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']
Tout dépend de votre environnement. Si vous n'avez qu'une seule interface avec une adresse IP attachée, vous pouvez simplement faire:
netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']
Si vous êtes derrière un NAT et que vous voulez connaître votre adresse IP publique, vous pouvez utiliser quelque chose comme:
import urllib2
ret = urllib2.urlopen('https://icanhazip.com/')
print ret.read()
J'espère que cela t'aides.