La dernière version de netifaces
peut le faire aussi, mais contrairement à pynetinfo
, il fonctionnera sur des systèmes autres que Linux (y compris Windows, OS X, FreeBSD et Solaris).
Il semble que http://pypi.python.org/pypi/pynetinfo/0.1.9 puisse le faire, mais je ne l'ai pas testé.
Pour ceux qui ne veulent pas de dépendance supplémentaire et n'aiment pas appeler des sous-processus, voici comment vous le faites vous-même en lisant /proc/net/route
directement :
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)))
Je n'ai pas de machine big-endian sur laquelle tester, donc je ne sais pas si l'endianité dépend de l'architecture de votre processeur, mais si c'est le cas, remplacez le <
en struct.pack('<L', ...
avec =
le code utilisera donc l'endianness natif de la machine.
Pour être complet (et pour développer la réponse d'alastair), voici un exemple qui utilise "netifaces" (testé sous Ubuntu 10.04, mais cela devrait être portable):
$ 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'
Documentation pour 'netifaces' :https://pypi.python.org/pypi/netifaces/