コンピュータによっては複数のIPアドレスが設定されて運用されている場合があります。
そんな時は先日書いた
PythonでコンピュータのIPアドレスを取得する方法
Pythonで動作しているコンピュータのIPアドレスを取得するには「socket」モジュールの「gethostname()」「gethostbyname()」を利用して簡単に取得することができます。
ではIPアドレスを1つしか取得できないので、ちょっとうまく行かないケースが出てきます。
Pythonでコンピュータに複数のIPアドレスが設定されている場合はどうすれば上手く取得できるのでしょうか?
IPアドレスが複数設定されている場合でも上手く取得する方法
サーバーなどでは信頼性を上げるためなどにネットワークを冗長化してある場合があります。
そのため、複数のIPアドレスが1つのコンピュータに設定されている場合があります。
そんな時はPythonでコンピュータのIPアドレスを取得するにはちょっとした工夫が必要なようです。
難しいので以下のURLを参考に作ってみます。
302 Found
複数のIPアドレス取得
複数のIPアドレスを取得するには「psutil」モジュールを利用します。
モジュールをインストールするにはコマンドプロンプトで
pip install psutil
を実行してください。
これで準備は完了です。
実際にIPアドレスを取得する関数は既出のURLのソースをそのまま利用します。
import socket import psutil def get_ip_addresses( family ): for interface, snics in psutil.net_if_addrs().items() : for snic in snics : if snic.family == family : yield( interface, snic.address ) ipv4s = list(get_ip_addresses(socket.AF_INET)) ipv6s = list(get_ip_addresses(socket.AF_INET6))
上記の「ipv4s」、「ipv6s」にIPv4とIpv&の情報が設定されるので
for ipv in ipv4s : print( "ipv4 name={0},ip={1}".format( ipv[ 0 ], ipv[ 1 ] )) for ipv in ipv6s : print( "ipv6 name={0},ip={1}".format( ipv[ 0 ], ipv[ 1 ] ))
としてやれば表示できます。
#ipv4 name=ネットワーク1,ip=XXX.XXX.XXX.X #ipv4 name=Loopback Pseudo-Interface 1,ip=127.0.0.1 #ipv6 name=ネットワーク1,ip=XXXX::XXXX:XXXX:XXXX:XXXX #ipv6 name=Loopback Pseudo-Interface 1,ip=::1
※上記の例は1つしかIPアドレスが設定されていませんが、複数設定されている場合でも正常に取得できます。
まとめ
Pythonで複数のIPアドレスが設定されているものを取得する場合は「psutil」モジュールを利用すればIPv4、IPv6のどちらでも取得することができます。
以上、Pythonで複数設定されているIPアドレスを取得する方法でした。