Как получить имена сетевых карт в Python? - PullRequest
19 голосов
/ 01 октября 2010

Я совершенно новичок в программировании на Python, поэтому, пожалуйста, будьте терпеливы со мной.

Есть ли способ получить имена карт NIC в машине и т. Д. Eth0, вот так?Если да, то как вы это делаете?

Я исследовал, но до сих пор я нашел только коды для получения только IP-адресов и MAC-адресов, такие как

import socket
socket.gethostbyname(socket.gethostname())

Советы по кодам будут действительнобыть оцененнымСпасибо!

Ответы [ 7 ]

26 голосов
/ 19 мая 2015

В Linux вы можете просто перечислить ссылки в / sys / class / net / по

os.listdir('/sys/class/net/')

Не уверен, работает ли это во всех дистрибутивах.

18 голосов
/ 12 декабря 2017

Отличная библиотека Python, которую я использовал для этого, - psutil . Он может использоваться в Linux, Windows и OSX среди других платформ и поддерживается с Python 2.6 до 3.6.

Psutil предоставляет функцию net_if_addrs () , которая возвращает словарь, в котором ключами являются имена сетевых карт, а значением является список именованных кортежей для каждого адреса, назначенного сетевой карте, включая семейство адресов, адрес сетевой карты маска сети, широковещательный адрес и адрес назначения.

Простой пример использования net_if_addrs(), который выведет список имен сетевых карт в Python:

import psutil

addrs = psutil.net_if_addrs()
print(addrs.keys())
17 голосов
/ 04 сентября 2012

Поскольку этот ответ появляется в Google при поиске этой информации, я подумал, что должен добавить свою технику для получения доступных интерфейсов (а также IP-адресов). Очень хороший модуль netifaces позаботится об этом в переносимой форме.

10 голосов
/ 01 октября 2010

Я не думаю, что в стандартной библиотеке есть что-то, что могло бы запросить эти имена.

Если бы мне нужны эти имена в системе Linux, я бы проанализировал вывод ifconfig или содержимое /proc/net/dev. Посмотрите на эту запись в блоге для аналогичной проблемы.

5 голосов
/ 28 мая 2015

С помощью Python ctypes вы можете вызвать функцию библиотеки C getifaddrs:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from ctypes import *

class Sockaddr(Structure):
    _fields_ = [('sa_family', c_ushort), ('sa_data', c_char * 14)]

class Ifa_Ifu(Union):
    _fields_ = [('ifu_broadaddr', POINTER(Sockaddr)),
                ('ifu_dstaddr', POINTER(Sockaddr))]

class Ifaddrs(Structure):
    pass

Ifaddrs._fields_ = [('ifa_next', POINTER(Ifaddrs)), ('ifa_name', c_char_p),
                    ('ifa_flags', c_uint), ('ifa_addr', POINTER(Sockaddr)),
                    ('ifa_netmask', POINTER(Sockaddr)), ('ifa_ifu', Ifa_Ifu),
                    ('ifa_data', c_void_p)]


def get_interfaces():
    libc = CDLL('libc.so.6')
    libc.getifaddrs.restype = c_int
    ifaddr_p = pointer(Ifaddrs())
    ret = libc.getifaddrs(pointer((ifaddr_p)))
    interfaces = set()
    head = ifaddr_p
    while ifaddr_p:
        interfaces.add(ifaddr_p.contents.ifa_name)
        ifaddr_p = ifaddr_p.contents.ifa_next
    libc.freeifaddrs(head) 
    return interfaces

if __name__ == "__main__":
    print(get_interfaces())

Обратите внимание, хотя этот метод не является переносимым.

5 голосов
/ 06 сентября 2013

Чтобы добавить к тому, что упоминает @Kristian Evensen, вот что я использовал для решения проблемы, с которой столкнулся.Если вы хотите просто получить список интерфейсов, используйте:

interface_list = netifaces.interfaces()

Если вы хотите конкретный интерфейс, но не знаете, какой номер в конце (то есть: eth0),использование:

interface_list = netifaces.interfaces()
interface = filter(lambda x: 'eth' in x,interface_list)
3 голосов
/ 21 сентября 2017

Как сказал Дэвид Бройер, вы можете просто перечислить каталог "/ sys / class / net" в Linux.(Это работает на Fedora по крайней мере).Если вам нужна подробная информация о каком-либо интерфейсе, вы можете перемещаться по каталогам intefaces для более подробной информации.

def getAllInterfaces():
    return os.listdir('/sys/class/net/')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...