Nejnovější verze netifaces
umí to také, ale na rozdíl od pynetinfo
, bude fungovat na jiných systémech než Linux (včetně Windows, OS X, FreeBSD a Solaris).
Zdá se, že http://pypi.python.org/pypi/pynetinfo/0.1.9 to umí, ale netestoval jsem to.
Pro ty lidi, kteří nechtějí další závislost a nemají rádi volání podprocesů, zde je návod, jak to udělat sami přečtením /proc/net/route
přímo:
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)))
Nemám stroj big-endian k testování, takže si nejsem jistý, zda endianness závisí na architektuře vašeho procesoru, ale pokud ano, nahraďte <
v struct.pack('<L', ...
s =
takže kód bude používat nativní endianness stroje.
Pro úplnost (a pro rozšíření alastairovy odpovědi) je zde příklad, který používá „netifaces“ (testováno pod Ubuntu 10.04, ale mělo by být přenosné):
$ 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'
Dokumentace pro 'netifaces':https://pypi.python.org/pypi/netifaces/