[解決済み] PythonでNIC(ネットワークインターフェースコントローラ)からIPアドレスを取得するにはどうしたらいいですか?
質問
Unix上のPythonスクリプトでエラーが発生した場合、メールが送信されます。
IP アドレスがテスト サーバーである 192.168.100.37 の場合、電子メールの件名に {テスト環境} を追加するよう依頼されました。この方法で、1 つのバージョンのスクリプトを用意し、電子メールがテスト サーバー上の混乱したデータから来ているかどうかを判断する方法を提供できます。
しかし、ググってみると、このようなコードを見つけることができます。
import socket
socket.gethostbyname(socket.gethostname())
しかし、これではIPアドレスが127.0.1.1になってしまいます。私が
ifconfig
を使用すると、次のようになります。
eth0 Link encap:Ethernet HWaddr 00:1c:c4:2c:c8:3e
inet addr:192.168.100.37 Bcast:192.168.100.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:75760697 errors:0 dropped:411180 overruns:0 frame:0
TX packets:23166399 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:59525958247 (59.5 GB) TX bytes:10142130096 (10.1 GB)
Interrupt:19 Memory:f0500000-f0520000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:25573544 errors:0 dropped:0 overruns:0 frame:0
TX packets:25573544 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:44531490070 (44.5 GB) TX bytes:44531490070 (44.5 GB)
まず、どこから127.0.1.1を取得したのか分かりませんが、どちらにしても私が欲しいのはこれではないのです。ググると同じ構文に行き着きます。 Bash スクリプトやnetifaces、そして私は標準的なライブラリを使用しようとしています。
では、Pythonでeth0のIPアドレスを取得するにはどうすればいいのでしょうか?
どのように解決するのですか?
2つの方法があります。
方法その1(外部パッケージを利用する)
にバインドされている IP アドレスを問い合わせる必要があります。
eth0
インターフェイスにバインドされている IP アドレスを尋ねる必要があります。これは
netifaces パッケージ
import netifaces as ni
ni.ifaddresses('eth0')
ip = ni.ifaddresses('eth0')[ni.AF_INET][0]['addr']
print(ip) # should print "192.168.100.37"
また、利用可能なすべてのインターフェースのリストは、以下の方法で取得できます。
ni.interfaces()
方法2(外部パッケージなし)
pythonのパッケージを使わずにIPアドレスを取得する方法を紹介します。
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
get_ip_address('eth0') # '192.168.0.110'
注:使用している環境を判断するためにIPアドレスを検出することは、かなりハックされています。ほとんどすべてのフレームワークは現在の環境を示すために環境変数を設定/変更する非常にシンプルな方法を提供します。これについては、ドキュメントを見てみてください。以下のように簡単であるべきです
if app.config['ENV'] == 'production':
#send production email
else:
#send development email
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] リストの最後の要素を取得する方法
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] バブルソートの宿題
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Pythonでファイルの読み込みと上書きをする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのstdlibを使ったローカルIPアドレスの検索
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Pythonによる一対のクロスプロダクト [重複] (英語)
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] MACアドレスの取得