Python で gethostbyname で IPアドレスを取得したら 127.0.0.1 が返ってきて困った
Python で 自身のIPアドレスを取得する方法でネット上で散見しているのが、
import socket
ip_addr = socket.gethostbyname(socket.gethostname())
ので、Linuxで取得できる方法を調べた。
ネットワークインターフェース名(eth0とか)を指定して取得する
netifacesのifaddressesを使えばインターフェース名がわかっていればダイレクトにIPアドレスがとれる。
インターフェース名が "eth0"だとしたら、
import netifaces
ip_addr = netifaces.ifaddresses("eth0")[netifaces.AF_INET][0]['addr']
ただ最近のネットワークインターフェース名 eth0 じゃなく、 enp2s0 だったりするし、無線のほう(wlan0やwlp1s0)かもしれないし、いろんなLinuxマシンで動かしたい場合に決め打ちだと困る。
ので、インターフェース名はその都度取得したいところ。
で、取得するには、
import socket
if_nameindex_list = socket.if_nameindex()
ちなみに有線が2つあるとか、有線と無線で両方IPアドレス設定してるとかあるとかの場合、当然、そのうちのどれを使うのかなんてそのプログラム次第なので、そのあたりは各人が勝手に判断してくれ。
Windows でも Linux でも Python で IPアドレス が取得できるソース
上記を踏まえてソース。
os.nameはwindowsだとnt、Linuxだとposixが返却されるのでそれで分岐している。
もし、そのインターフェースにIPアドレスが設定されてない場合はKeyErrorが飛ぶのでtry catch で対処している。
また、127.0.0.1を取得してもしょうがない(127.0.0.1がいやでこの話始まっとるわけで)のでそこはスキップするようにしている。
import netifaces
import os
import socket
def main():
my_ip_addr = ''
if os.name == "nt":
# Windowsの場合
my_ip_addr = socket.gethostbyname(socket.gethostname())
print(my_ip_addr)
elif os.name == "posix":
# Linuxの場合
if_nameindex_list = socket.if_nameindex()
for if_nameindex in if_nameindex_list:
try:
my_ip_addr = netifaces.ifaddresses(if_nameindex[1])[netifaces.AF_INET][0]['addr']
if my_ip_addr != '127.0.0.1':
print(if_nameindex[1] + " : " + my_ip_addr)
break
except KeyError:
print(if_nameindex[1] + ' has no addr.')
if __name__ == "__main__":
main()
やったね!
以上!