2010-10-01 21 views
14

मैं पाइथन प्रोग्रामिंग के लिए बिल्कुल नया हूं इसलिए कृपया मेरे साथ धैर्य रखें।पायथन में नेटवर्क इंटरफेस कार्ड नाम कैसे प्राप्त करें?

क्या मशीन में एनआईसी कार्ड के नाम प्राप्त करने के लिए वैसे भी है eth_, lo? यदि ऐसा, तो तुम यह कैसे करते हो?

मैं शोध किया है, लेकिन अभी तक मैं केवल IP पते और MAC पते कोड पर केवल इस तरह के

रूप
import socket 
socket.gethostbyname(socket.gethostname()) 

सलाह वास्तव में सराहना की जाएगी प्राप्त करने के लिए कोड मिल गया है। धन्यवाद!

उत्तर

10

मुझे नहीं लगता कि इन नामों के लिए मानक पुस्तकालय में कुछ भी है।

यदि मुझे लिनक्स सिस्टम पर इन नामों की आवश्यकता है तो मैं ifconfig या /proc/net/dev की सामग्री का विश्लेषण करूंगा। इसी तरह की समस्या के लिए इस blog entry पर देखें।

+0

खिड़कियों के लिए के बारे में क्या? क्या इस तरह कोई रास्ता है? – JavaNoob

+0

विंडोज़ मेरी मजबूत तरफ नहीं है। शायद 'ipconfig/all' द्वारा प्रदान की गई कुछ जानकारी उपयुक्त है? – Arlaharen

+0

खुले में 'eth0' ('/ proc/net/dev') पढ़ें।) – Sandeep

11

चूंकि मैं इस जानकारी की खोज करते समय Google में यह उत्तर पॉप अप करता हूं, मैंने सोचा कि मुझे उपलब्ध इंटरफेस (साथ ही साथ आईपी पते) प्राप्त करने के लिए अपनी तकनीक जोड़नी चाहिए। बहुत अच्छा मॉड्यूल netifaces पोर्टेबल तरीके से इसका ख्याल रखता है।

3

@ क्रिस्टियन शार्सन के उल्लेखों को जोड़ने के लिए, यहां मैंने जो समस्या आई थी, उसके लिए मैंने यहां उपयोग किया था। तुम सिर्फ इंटरफेस की एक सूची प्राप्त करने के लिए देख रहे हैं, तो का उपयोग करें:

interface_list = netifaces.interfaces() 

आप एक विशिष्ट इंटरफ़ेस इच्छुक रहे हैं, तो लेकिन पता नहीं है अंत में संख्या क्या है (यानी: eth0), उपयोग :

interface_list = netifaces.interfaces() 
interface = filter(lambda x: 'eth' in x,interface_list) 
+0

सभी इंटरैस eth * –

+1

@jonas के साथ शुरू नहीं होते हैं, उदाहरण के लिए मैं eth का उपयोग कर रहा था। वे eth के स्थान पर लो का उपयोग कर सकते हैं। मेरा मानना ​​है कि मैंने जो जवाब दिया वह ओपी के बारे में पूछने के लिए पर्याप्त था। यकीन नहीं है कि यह एक डाउनवोट के लायक था। – nihiser

+0

यह सवाल का जवाब नहीं देता है: 'मशीन में एनआईसी कार्ड के नाम प्राप्त करें'। आप इंटरफ़ेस नाम या उपसर्ग बिल्कुल नहीं जानते हैं। आपको जितना संभव हो उतना लचीला कोड करना चाहिए। –

19

लिनक्स पर, तुम बस /sys/वर्ग में लिंक/नेट/

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

सुनिश्चित नहीं हैं द्वारा सूचीबद्ध कर सकते हैं, तो यह सब distr पर काम करता है ibutions।

3

का उपयोग अजगर के ctypes आप सी पुस्तकालय समारोह 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()) 

टिप्पणी करते, हालांकि इस विधि पोर्टेबल नहीं है।

0

डेविड ब्रुएर की तरह, आप लिनक्स पर "/ sys/class/net" निर्देशिका को सूचीबद्ध कर सकते हैं। (यह कम से कम फेडोरा पर काम करता है)। यदि आपको कुछ इंटरफ़ेस के बारे में जानकारी दी गई है तो आप अधिक के लिए intefaces की निर्देशिकाओं पर नेविगेट कर सकते हैं।

def getAllInterfaces(): 
    return os.listdir('/sys/class/net/') 
4

एक महान पायथन पुस्तकालय मैंने ऐसा करने के लिए उपयोग किया है psutil है। इसका उपयोग अन्य प्लेटफार्मों के बीच लिनक्स, विंडोज और ओएसएक्स पर किया जा सकता है और इसे पायथन 2.6 से 3.6 तक समर्थित किया जाता है।

Psutil net_if_addrs() फ़ंक्शन प्रदान करता है जो एक शब्दकोश देता है जहां कुंजी एनआईसी नाम होते हैं और मूल्य एनआईसी को सौंपा गया प्रत्येक पता के लिए नामित टुपल्स की एक सूची है जिसमें पता परिवार, एनआईसी पता, नेटमास्क, प्रसारण पता और गंतव्य शामिल है पता।

जो एनआईसी नामों की एक अजगर सूची प्रिंट होगा एक साधारण उदाहरण net_if_addrs() का उपयोग कर:

import psutil 

addrs = psutil.net_if_addrs() 
print(addrs.keys()) 
+1

यह सबसे अच्छा जवाब है। विन/लिनक्स/मैक पर काम करता है और एक अच्छी तरह से प्रलेखित लाइब्रेरी है जिसे कई अन्य ओएस आत्मनिरीक्षण में उपयोग किया जा सकता है। –

संबंधित मुद्दे