Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Y a-t-il une manière plus élégante de récupérer l'adresse IP d'une machine cliente sous Mac OS (mode DHCP) ?

+2 votes

Pour l'instant, je vois cela, mais je ne trouve pas cela élégant même si cela produit le résultat escompté :

ifconf = subprocess.Popen(['/sbin/ifconfig'], 
    stdout=subprocess.PIPE,)
grep1 = subprocess.Popen(['grep', 'inet'], stdin=ifconf.stdout, 
    stdout=subprocess.PIPE)
grep2 = subprocess.Popen(['grep', '-v', '127.0.0.1'], stdin=grep1.stdout, 
    stdout=subprocess.PIPE,)
end_of_pipe = grep2.stdout

return [line.strip() for line in end_of_pipe][-1].split(' ')[1]

Si vous avez des pistes à me donner. Je précise que je ne veux employer aucun module extérieur. Mon script doit rester autonome.

demandé 3-Mar-2015 par DoubleNain (1,718 points)

2 Réponses

+2 votes
 
Meilleure réponse

Tu pourrais parser la sortie de ifconfig directement en python plutôt que de spawner 2 process grep en plus, mais c'est assez cosmétique.

Sinon le moyen le plus robuste que je connaisse c'est d'établir une connection et de lire l'adresse source. Pour ne pas dépendre d'un service externe, le plus malin c'est d'utiliser une socket UDP qui fait du broadcast:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # une socket en mode UDP (DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)  # broadcast
s.connect(('<broadcast>', 0))  # le mot-clé python pour INADDR_BROADCAST
address, port = s.getsockname()  # renvoit l'adresse source et le port source de la connection
print(address)

Je crois que le * broadcast * ne plaira pas à ton système si tu es en IPV6.

répondu 3-Mar-2015 par bulange (618 points)
edité 4-Mar-2015 par bulange

Merci, je pense que c'est la solution la plus propre.

Envoyer un paquet (de broadcast qui plus est), pour récupérer une adresse locale...waouh, too much overkill!
Pour moi la solution de c0da est la plus simple et la plus propre.

+2 votes

Si c'est l'adresse locale que tu souhaites récuperer, tu peux faire:

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

Pour l'adresse publique tu peux essayer:

import json
import urllib

data = json.loads(urllib.urlopen("http://ip.jsontest.com/").read())
print data["ip"]

Les deux commandes ont été testé sous OS X 10.9.5.

répondu 3-Mar-2015 par barnumbirr (2,750 points)
...