Python netifaces 庫詳解:跨平臺網絡接口與 IP 地址管理


一、前言

在現代網絡編程中,獲取本機的網絡接口信息和 IP 配置是非常常見的需求。
例如:

  • 開發一個需要選擇合適網卡的 網絡服務
  • 在多網卡環境下實現 流量路由與控制
  • 在系統診斷工具中展示 IP/MAC 地址子網掩碼默認網關
  • 編寫跨平臺工具時需要兼容 Linux、Windows、macOS 的網絡接口管理。

在 Python 標準庫中,雖然 socket 模塊提供了部分網絡功能,但缺乏直接、簡潔的方法來獲取 所有網卡與其詳細信息
此時,netifaces 庫便成為一個非常實用的工具。


二、netifaces 簡介

1. 什么是 netifaces?

netifaces 是一個跨平臺的 Python 庫,用于枚舉網絡接口、獲取其地址(IPv4、IPv6、MAC)、子網掩碼、廣播地址以及默認網關信息。

它的特點是:

  • 輕量級:安裝簡單,無需依賴復雜的第三方庫。
  • 跨平臺支持:兼容 Linux、Windows、macOS 等。
  • 功能專一:專注于 網卡與 IP 信息獲取,不提供網絡通信功能。
  • 與 socket 模塊互補:socket 偏重通信,netifaces 偏重信息獲取。

2. 適用場景

  • 系統監控工具:展示網絡接口信息。
  • 自動化運維腳本:檢測并選擇可用 IP 地址。
  • 分布式系統:在多網卡機器上自動綁定合適的網卡。
  • 網絡診斷:輔助排查網絡配置問題。

三、安裝與快速體驗

1. 安裝

pip install netifaces

驗證安裝:

import netifaces
print(netifaces.interfaces())

2. 示例:獲取所有網絡接口

import netifacesinterfaces = netifaces.interfaces()
print("本機網絡接口列表:")
for iface in interfaces:print(iface)

在 Linux 機器上可能輸出:

本機網絡接口列表:
lo
eth0
wlan0
docker0

在 Windows 上可能輸出:

本機網絡接口列表:
{12345678-ABCD-90EF-1234-567890ABCDEF}
{11223344-5566-7788-99AA-BBCCDDEEFF00}

四、netifaces 核心 API

1. netifaces.interfaces()

返回本機所有網絡接口名稱。

2. netifaces.ifaddresses(interface)

返回指定接口的地址信息。

示例:

import netifacesinfo = netifaces.ifaddresses("eth0")
print(info)

輸出示例(Linux):

{17: [{'addr': '00:1a:2b:3c:4d:5e'}],  # 鏈路層 (MAC)2: [{'addr': '192.168.1.100', 'netmask': '255.255.255.0', 'broadcast': '192.168.1.255'}], # IPv410: [{'addr': 'fe80::1a2b:3c4d:5e6f%eth0'}] # IPv6
}

3. netifaces.gateways()

獲取默認網關和所有接口的路由信息。

示例:

import netifacesgws = netifaces.gateways()
print(gws)

輸出示例:

{'default': {2: ('192.168.1.1', 'eth0')}, 2: [('192.168.1.1', 'eth0', True)],10: [('fe80::1', 'eth0', True)]
}

其中:

  • 2 表示 IPv4
  • 10 表示 IPv6

4. 地址族常量

  • netifaces.AF_INET:IPv4
  • netifaces.AF_INET6:IPv6
  • netifaces.AF_LINK:MAC 地址

五、實戰案例

1. 獲取本機 IPv4 地址

import netifacesdef get_ipv4_address(interface):try:info = netifaces.ifaddresses(interface)return info[netifaces.AF_INET][0]['addr']except KeyError:return Nonefor iface in netifaces.interfaces():ip = get_ipv4_address(iface)if ip:print(f"{iface}: {ip}")

2. 獲取默認網關

import netifacesgws = netifaces.gateways()
default_gateway = gws['default'][netifaces.AF_INET][0]
print("默認網關:", default_gateway)

3. 判斷某接口是否有網絡

import socketdef check_internet(ip="8.8.8.8", port=53, timeout=3):try:socket.setdefaulttimeout(timeout)socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect((ip, port))return Trueexcept Exception:return Falseprint("網絡是否可用:", check_internet())

4. 多網卡路由選擇

在有 eth0wlan0 的機器上,自動選擇有公網 IP 的接口作為通信接口。

5. 網絡診斷工具

輸出類似 ifconfigip addr 的結果。

import netifacesfor iface in netifaces.interfaces():print(f"接口: {iface}")addrs = netifaces.ifaddresses(iface)if netifaces.AF_INET in addrs:for link in addrs[netifaces.AF_INET]:print("  IPv4:", link['addr'])if netifaces.AF_INET6 in addrs:for link in addrs[netifaces.AF_INET6]:print("  IPv6:", link['addr'])if netifaces.AF_LINK in addrs:for link in addrs[netifaces.AF_LINK]:print("  MAC:", link['addr'])

六、跨平臺注意事項

  1. Linux

    • 接口名為 eth0, wlan0, lo 等。
    • ifconfigip addr 結果與 netifaces 一致。
  2. Windows

    • 接口名為 GUID(長字符串),需額外處理。
    • 可以使用 socket.gethostbyname(socket.gethostname()) 輔助獲取本機 IP。
  3. macOS

    • 接口名為 en0, en1 等。

七、與其他庫對比

功能netifacespsutilsocket
獲取網卡列表???
獲取 IPv4 / IPv6??部分
獲取 MAC 地址???
獲取默認網關???
跨平臺支持???
系統資源監控???

結論:

  • 如果只需要網絡接口信息,推薦 netifaces
  • 如果需要更多系統信息(CPU、內存、網絡流量),推薦 psutil
  • 如果只是做網絡通信,使用 socket 即可。

八、進階應用

1. 自動綁定公網 IP

在分布式服務中,程序需要自動選擇公網 IP 進行注冊。

def get_public_ip():for iface in netifaces.interfaces():addrs = netifaces.ifaddresses(iface).get(netifaces.AF_INET, [])for addr in addrs:ip = addr['addr']if not ip.startswith("192.168.") and not ip.startswith("10."):return ip

2. 容器與虛擬機場景

在 Docker、VMware、KVM 等虛擬化環境中,機器可能有多個虛擬網卡。
netifaces 可以幫助我們區分 宿主機 IP容器/虛擬機 IP

3. 與 ZeroMQ 結合

在使用 pyzmq 進行分布式通信時,可以用 netifaces 自動選擇合適的網卡綁定。


九、性能與限制

1. 性能

  • 純 C 擴展實現,性能開銷小。
  • 僅用于查詢信息,不進行數據傳輸。

2. 限制

  • 只讀操作:不能修改網卡配置。
  • 接口名處理:在 Windows 上需轉換 GUID。
  • 功能專一:只適合獲取接口與 IP 信息,不支持實時流量統計。

十、總結

netifaces 是一個小而美的 Python 庫,功能專注于 跨平臺獲取網絡接口信息
通過它,我們可以:

  • 獲取所有網卡、IP、MAC 地址;
  • 查詢默認網關;
  • 構建跨平臺的網絡診斷工具;
  • 在多網卡環境中自動選擇合適的 IP 綁定。

psutil 相比,netifaces 更輕量、更專注;與 socket 相比,它提供了更高層次的接口抽象。

如果你正在開發 分布式系統、運維工具、網絡診斷應用netifaces 無疑是一個非常值得掌握的工具。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93778.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93778.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93778.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML應用指南:利用POST請求獲取上海黃金交易所金價數據

上海黃金交易所(SGE)作為中國唯一經國務院批準、專門從事黃金等貴金屬交易的國家級市場平臺,自成立以來始終秉持“公開、公平、公正”的原則,致力于構建規范、高效、透明的貴金屬交易市場體系。交易所通過完善的交易機制、嚴格的風…

C++常見面試題-1.C++基礎

一、C 基礎 1.1 語言特性與區別C 與 C 的主要區別是什么?C 為何被稱為 “帶類的 C”? 主要區別:C 引入了面向對象編程(OOP)特性(類、繼承、多態等),而 C 是過程式編程語言&#xff1…

Tomcat里catalina.sh詳解

在 Tomcat 中,catalina.sh(Linux/macOS)或 catalina.bat(Windows)是 核心的啟動和關閉腳本,用于控制 Tomcat 服務器的運行。它是 Tomcat 的“主控腳本”,負責設置環境變量、啟動/關閉 JVM 進程&…

STM32之MCU和GPIO

一、單片機MCU 1.1 單片機和嵌入式 嵌入式系統 以計算機為核心,tips:計算機【處理單元,內存 硬盤】 可以控制的外部設備,傳感器,電機,繼電器 嵌入式開發 數據源--> 處理器(CPU MCU MPU) --> 執行器 …

22_基于深度學習的桃子成熟度檢測系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹🎯 功能展示🌟 一、環境安裝🎆 環境配置說明📘 安裝指南說明🎥 環境安裝教學視頻 🌟 二、數據集介紹🌟 三、系統環境(框架/依賴庫)說明🧱 系統環…

數據結構:二叉樹oj練習

在講今天的題目之前,我們還需要講一下二叉樹的以下特點: 對任意一顆二叉樹,如果度為0的節點個數是n0,度為2的節點個數是n2,則有n0n21. 證明:二叉樹總的節點個數是n,那么有nn0n1n2 二叉樹的度為…

RabbitMQ高級特性——TTL、死信隊列、延遲隊列、事務、消息分發

目錄 一、TTL 1.1設置消息的TTL 1.2設置隊列的TTL 1.3兩者之間的區別 二、死信隊列 2.1死信的概念 2.2死信產生的條件: 2.3死信隊列的實現 死信隊列的工作原理 2.4常??試題 三、延遲隊列 3.1概念 3.2應用場景 3.3RabbitMQ 實現延遲隊列的核心原理 1…

神經網絡設計中關于BN歸一化(Normalization)的討論

在神經網絡的結構中,我們常常可以看見歸一化(Normalization)如BN的出現,無論是模型的backbone或者是neck的設計都與它有著重大的關系。 因此引發了我對它的思考,接下來我將從 是什么(知識領域,誕…

MacOS 安全機制與“文件已損壞”排查完整指南

1. 背景說明macOS 為了保護系統安全,內置了多個安全機制:機制作用是否影響第三方 AppSIP (System Integrity Protection)保護系統關鍵文件/目錄不被篡改高風險 App/驅動可能受限Gatekeeper限制未簽名/未認證 App 運行阻止“未知開發者” App文件隔離屬性…

package.json文件中的devDependencies和dependencies對象有什么區別?

前端項目的package.json文件中,dependencies和devDependencies對象都用于指定項目所依賴的軟件包,但它們在項目的開發和生產環境中的使用有所不同。1.dependencies:dependencies是指定項目在生產環境中運行所需要的依賴項。這些依賴項通常包括…

【最新版】CRMEB Pro版v3.4系統源碼全開源+PC端+uniapp前端+搭建教程

一.系統介紹 crmebPro版 v3.4正式發布,智能任務推送、動態標簽管理、商城AI生產力,煥然一新,不負期待!頁面DIY設計功能全面升級,組件更豐富,樣式設計更全面;移動端商家管理,讓商城管…

AI 浪潮下 IT 從業者的職業展望:替代之惑與轉型之道

一、引言1.1 科技變革的浪潮:AI 崛起與 IT 行業震蕩在當今科技飛速發展的時代,人工智能(AI)無疑是最具影響力的變革力量之一。從實驗室的前沿研究到廣泛的商業應用,AI 以驚人的速度滲透到各個領域,徹底改變…

DSP音頻算法移植優化工程師實戰

以下以音頻FIR濾波器算法為例,完整演示從MATLAB原型 → Python驗證 → TI DSP C語言移植優化的全流程,包含關鍵代碼和優化技巧:關鍵優化技術解析: 內存訪問優化使用#pragma DATA_ALIGN確保64位對齊(滿足LDDW指令要求&a…

Spark 運行流程核心組件(三)任務執行

一、啟動模式 1、standalone資源申請:Driver向Master申請Executor資源Executor啟動:Master調度Worker啟動Executor注冊通信:Executor直接向Driver注冊 2、YARNDriver向YARN ResourceManager(RM)申請AM容器RM分配NodeManager(NM)啟動AM&#x…

rabbitmq發送的延遲消息時間過長就立即消費了

RabbitMQ延遲消息在設置過長時間后被立即消費的問題,通常與以下原因有關: TTL限制問題 RabbitMQ對消息TTL(Time To Live)有32位整數限制(0-4294967295毫秒),約49.7天。超過該值的延遲時間會導致消息立即被消費解決方案:確保設置的…

kafka的pull的依據

1. 每次 pull() 是否必須在提交上一批消息的 offset 之后?絕對不需要! 提交 offset 和調用 poll() (拉取消息) 是兩個完全獨立的行為。消費者可以連續調用 poll() 多次,期間完全不提交任何 offset。 這是 Kafka 消費者的正常工作模式。提交 o…

學習嵌入式的第二十一天——數據結構——鏈表

單向鏈表特點:存儲的內存空間不連續 。為了彌補順序存儲存劣勢。優勢 插入,刪除 O(1) 動態存儲 ,在程序運行期間決定大小。劣勢: 不能隨機訪問 O(N) 節點-> 數據域指針域 順序表(數組) 只有數據域鏈表的操作代碼&#xff1…

Rust Web 全棧開發(十三):發布

Rust Web 全棧開發(十三):發布Rust Web 全棧開發(十三):發布發布 teacher_service發布 svr測試 teacher_service 和 svr發布 wasm-client測試 wasm-clientRust Web 全棧開發(十三)&a…

Zephyr 中的 bt_le_per_adv_set_data 函數的介紹和應用方法

目錄 概述 1 函數接口介紹 1.1 函數原型 1.2 功能詳解 2 使用方法 2.1 創建流程 2.1.1 創建擴展廣播實例 2.1.2 設置周期性廣播數據 2.1.3 配置周期性廣播參數 2.1.4 啟動廣播 2.2 主流程函數 2.3 關鍵配置 (prj.conf) 3 高級用法 3.1 大數據分片傳輸 3.2 動態數…

Ansible 角色管理指南

Ansible 角色管理指南 實驗環境設置 以下命令用于準備實驗環境,創建一個工作目錄并配置基本的Ansible設置: # 創建web工作目錄并進入 [azurewhiskycontroller ~]$ mkdir web && cd web# 創建Ansible配置文件 [azurewhiskycontroller web]$ cat &…