L'ultima versione di netifaces
può fare anche questo, ma a differenza di pynetinfo
, funzionerà su sistemi diversi da Linux (inclusi Windows, OS X, FreeBSD e Solaris).
Sembra che http://pypi.python.org/pypi/pynetinfo/0.1.9 possa farlo, ma non l'ho testato.
Per quelle persone che non vogliono una dipendenza extra e non amano chiamare i sottoprocessi, ecco come farlo tu stesso leggendo /proc/net/route
direttamente:
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)))
Non ho una macchina big-endian su cui testare, quindi non sono sicuro che l'endianness dipenda dall'architettura del tuo processore, ma se lo è, sostituisci <
in struct.pack('<L', ...
con =
quindi il codice utilizzerà l'endianness nativo della macchina.
Per completezza (e per espandere la risposta di alastair), ecco un esempio che utilizza "netifaces" (testato con Ubuntu 10.04, ma dovrebbe essere portatile):
$ 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'
Documentazione per 'netifaces':https://pypi.python.org/pypi/netifaces/