IP アドレスを取得することは、想像以上に困難です。
私が見つけた1つの信頼できる方法について、私が提供したこの回答を確認してください。
クリックしたくない場合の答えは次のとおりです。
モジュールを使用しnetifaces
ます。ネットワーキングは複雑なため、netifaces の使用は少し難しい場合がありますが、次の方法で目的を達成できます。
>>> import netifaces
>>> netifaces.interfaces()
['lo', 'eth0']
>>> netifaces.ifaddresses('eth0')
{17: [{'broadcast': 'ff:ff:ff:ff:ff:ff', 'addr': '00:11:2f:32:63:45'}], 2: [{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}], 10: [{'netmask': 'ffff:ffff:ffff:ffff::', 'addr': 'fe80::211:2fff:fe32:6345%eth0'}]}
>>> for interface in netifaces.interfaces():
... print netifaces.ifaddresses(interface)[netifaces.AF_INET]
...
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]
[{'broadcast': '10.0.0.255', 'netmask': '255.255.255.0', 'addr': '10.0.0.2'}]
>>> for interface in netifaces.interfaces():
... for link in netifaces.ifaddresses(interface)[netifaces.AF_INET]:
... print link['addr']
...
127.0.0.1
10.0.0.2
これは、次のようにもう少し読みやすくすることができます。
from netifaces import interfaces, ifaddresses, AF_INET
def ip4_addresses():
ip_list = []
for interface in interfaces():
for link in ifaddresses(interface)[AF_INET]:
ip_list.append(link['addr'])
return ip_list
IPv6 アドレスが必要な場合は、AF_INET6
代わりに を使用しAF_INET
ます。がリストやディクショナリをあちこちで使用する理由が気になる場合はnetifaces
、1 台のコンピューターに複数の NIC を配置でき、各 NIC に複数のアドレスを設定でき、各アドレスに独自のオプション セットがあるためです。