一、前言

在现代网络编程中,获取本机的网络接口信息和 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 &…