ぺーぱーふぇいす

雑記と備忘録。私はプログラマ。

【Python】Raspberry PiでPython使ってIPアドレスを取得する

Raspberry Piで動かすPythonスクリプト書いてて、処理の中で自身のローカルIPアドレスをちょっと調べる必要があった。

調べると出てくる標準のsocketライブラリを使う方法だと取得できるのが127.0.0.1だったので、お望みのローカルIPアドレスとかを取得できる方法をメモっとく。

結論

結論から。
外部モジュールのnetifacesを使う。

環境

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

$ python -V
Python 3.8.2

インストール

$ pip install netifaces

使い方

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import netifaces

def main():
     interface_data = netifaces.ifaddresses('eth0')
 
     ip_v4 = interface_data[netifaces.AF_INET][0]['addr']
     ip_v6 = interface_data[netifaces.AF_INET6][0]['addr']
     mac   = interface_data[netifaces.AF_LINK][0]['addr']

    result = f"""\
ローカルアドレス
IPv4: {ip_v4}
IPv6: {ip_v6}
MAC:  {mac}
"""

     print(result)

netifaces.ifaddresses(ネットワークインターフェース名)で指定したインターフェースの情報をとってきて、それでIPアドレスとかMACアドレスとかを表示している。

余談

よくある下記みたいに、Python標準のsocketモジュールを使う方法が紹介されているけど、冒頭で前述したとおり私の環境(Raspberry Pi)だと取得できたのが127.0.01になった。

調べてると、Ubuntuだとそうなるとか、そんなようなことが書かれていたのだけれど、RasbianでもそうなってるのでDebianベースのOSだとそうなるのかな? しらんけど。

参考

qiita.com

stackoverflow.com

www.whyit.work

https://momijiame.tumblr.com/post/44779612273/python-%E3%81%AE-netifaces-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%BE%97%E3%82%8B
momijiame.tumblr.com