Die neueste Version von netifaces
kann das auch, aber anders als pynetinfo
, es funktioniert auf anderen Systemen als Linux (einschließlich Windows, OS X, FreeBSD und Solaris).
Es scheint, dass http://pypi.python.org/pypi/pynetinfo/0.1.9 dies tun kann, aber ich habe es nicht getestet.
Für diejenigen, die keine zusätzliche Abhängigkeit wünschen und keine Unterprozesse aufrufen möchten, können Sie dies selbst tun, indem Sie /proc/net/route
lesen direkt:
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)))
Ich habe keinen Big-Endian-Rechner zum Testen, daher bin ich mir nicht sicher, ob die Endianness von Ihrer Prozessorarchitektur abhängt, aber wenn dies der Fall ist, ersetzen Sie die <
in struct.pack('<L', ...
mit =
Daher verwendet der Code die native Endianness der Maschine.
Der Vollständigkeit halber (und um die Antwort von Alastair zu erweitern) ist hier ein Beispiel, das "netifaces" verwendet (getestet unter Ubuntu 10.04, aber dies sollte portabel sein):
$ 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'
Dokumentation für 'netifaces':https://pypi.python.org/pypi/netifaces/