netifaces
の最新バージョン これもできますが、pynetinfo
とは異なります 、Linux 以外のシステム (Windows、OS X、FreeBSD、Solaris を含む) でも動作します。
http://pypi.python.org/pypi/pynetinfo/0.1.9 でできるようですが、テストしていません。
余分な依存関係を必要とせず、サブプロセスを呼び出すのが嫌いな人のために、/proc/net/route
を読んで自分で行う方法を次に示します。 直接:
import socket, struct
def get_default_gateway_linux():
"""Read the default gateway directly from /proc."""
with open("/proc/net/route") as fh:
for line in fh:
fields = line.strip().split()
if fields[1] != '00000000' or not int(fields[3], 16) & 2:
# If not default route or not RTF_GATEWAY, skip it
continue
return socket.inet_ntoa(struct.pack("<L", int(fields[2], 16)))
テストするビッグ エンディアンのマシンがないため、エンディアンがプロセッサ アーキテクチャに依存しているかどうかはわかりませんが、依存している場合は <
を置き換えてください struct.pack('<L', ...
で =
で そのため、コードはマシンのネイティブ エンディアンを使用します。
完全を期すために (そして alastair の回答を拡張するために)、「netifaces」を使用する例を次に示します (Ubuntu 10.04 でテスト済みですが、移植可能である必要があります)。
$ sudo easy_install netifaces
Python 2.6.5 (r265:79063, Oct 1 2012, 22:04:36)
...
$ ipython
...
In [8]: import netifaces
In [9]: gws=netifaces.gateways()
In [10]: gws
Out[10]:
{2: [('192.168.0.254', 'eth0', True)],
'default': {2: ('192.168.0.254', 'eth0')}}
In [11]: gws['default'][netifaces.AF_INET][0]
Out[11]: '192.168.0.254'
「netifaces」のドキュメント:https://pypi.python.org/pypi/netifaces/