web-dev-qa-db-fra.com

Python - Obtenir l'IP localhost

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?

11
VGO

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.

26
sloth

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.

18
Gabriel Samfira