Solución:
Para aquellas personas que no quieren una dependencia adicional y no les gusta llamar a subprocesos, así es como puede hacerlo usted mismo leyendo /proc/net/route
directamente:
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)))
No tengo una máquina big-endian para probar, por lo que no estoy seguro de si la endianidad depende de la arquitectura de su procesador, pero si es así, reemplace el <
en struct.pack('<L', ...
con =
por lo que el código utilizará el endianness nativo de la máquina.
Para completar (y ampliar la respuesta de alastair), aquí hay un ejemplo que usa “netifaces” (probado en Ubuntu 10.04, pero debería ser portátil):
$ 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'
Documentación para ‘netifaces’: https://pypi.python.org/pypi/netifaces/
Parece que http://pypi.python.org/pypi/pynetinfo/0.1.9 puede hacer esto, pero no lo he probado.