Versi terbaru dari netifaces
dapat melakukannya juga, tetapi tidak seperti pynetinfo
, ini akan bekerja pada sistem selain Linux (termasuk Windows, OS X, FreeBSD, dan Solaris).
Tampaknya http://pypi.python.org/pypi/pynetinfo/0.1.9 dapat melakukan ini, tetapi saya belum mengujinya.
Bagi orang-orang yang tidak menginginkan ketergantungan ekstra dan tidak suka memanggil subproses, inilah cara Anda melakukannya sendiri dengan membaca /proc/net/route
langsung:
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)))
Saya tidak memiliki mesin big-endian untuk diuji, jadi saya tidak yakin apakah endianness bergantung pada arsitektur prosesor Anda, tetapi jika ya, ganti <
di struct.pack('<L', ...
dengan =
jadi kode akan menggunakan endianness asli mesin.
Untuk kelengkapan (dan untuk memperluas jawaban alastair), berikut adalah contoh yang menggunakan "netifaces" (diuji di bawah Ubuntu 10.04, tetapi ini harus portabel):
$ 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'
Dokumentasi untuk 'netifaces':https://pypi.python.org/pypi/netifaces/