Python 获取本机所有网卡 IP/MAC 地址

本文详解 3 种 Python 实现方案,支持

Windows/Linux/MacOS

跨平台,完美适配多网卡场景,可直接获取所有网络适配器的 IP 地址、MAC 地址、网卡名称、子网掩码等信息,代码开箱即用!

一、应用场景

在网络编程、运维自动化、设备授权等场景中,经常需要获取本机网卡信息,常见需求包括:

  • 多网卡服务器自动识别可用 IP

  • 设备绑定(基于 MAC + IP 校验授权)

  • 本地网络调试、自动化脚本开发

  • 设备信息采集与上报系统

二、核心方案对比(先选对再用)

实现方案 依赖库 多网卡支持 信息完整性(IP+MAC + 网卡名) 跨平台 推荐度
标准库(socket+uuid) 无(内置) 一般 仅 IP + 默认 MAC,无网卡名 ⭐⭐
netifaces 第三方库 需安装 完美 完整(IP+MAC + 网卡名 + 子网掩码) ⭐⭐⭐⭐⭐
系统命令调用(ipconfig/ifconfig) 较好 IP+MAC,需解析输出 ⭐⭐⭐

结论:优先使用

netifaces

库,兼顾稳定性、完整性和易用性;无第三方库依赖场景用系统命令调用。

三、方案 1:标准库实现(无依赖,快速获取)

无需安装任何第三方包,基于 Python 内置 socket(获取 IP)和 uuid(获取 MAC)实现,适合简单场景。

完整代码

复制代码
import socket

import uuid

def get_default_host_ip():

   """获取本机默认上网 IP(优先返回外网可达 IP)"""

   try:

       # 连接公共 DNS(8.8.8.8 为 Google DNS),无需实际通信,仅用于获取本地网卡 IP

       s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

       s.connect(("8.8.8.8", 80))

       ip = s.getsockname()[0]  # 获取连接对应的本地 IP

   except Exception as e:

       ip = "127.0.0.1"  # 异常时返回本地回环地址

   finally:

       s.close()

   return ip

def get_default_mac_address():

   """获取本机默认网卡 MAC 地址"""

   # uuid.getnode() 返回 48 位整数形式的 MAC 地址

   mac_int = uuid.getnode()

   mac_hex = hex(mac_int)[2:]  # 转换为十六进制(去掉 0x 前缀)

   # 格式化为 xx:xx:xx:xx:xx:xx

   return ":".join([mac_hex[i:i+2] for i in range(0, 12, 2)])

def get_all_ipv4_addresses():

   """获取所有网卡的 IPv4 地址(过滤回环地址)"""

   hostname = socket.gethostname()

   # gethostbyname_ex 返回 (主机名, 别名列表, IP 列表)

   ip_list = socket.gethostbyname_ex(hostname)[2]

   # 过滤 127.0.0.1 等回环地址

   return [ip for ip in ip_list if not ip.startswith("127.")]

if __name__ == '__main__':

   print("=== 本机网络信息(标准库方案)===")

   print(f"默认上网 IP:{get_default_host_ip()}")

   print(f"默认 MAC 地址:{get_default_mac_address()}")

   print(f"所有网卡 IPv4:{get_all_ipv4_addresses()}")

运行效果

复制代码
=== 本机网络信息(标准库方案)===

默认上网 IP:192.168.1.105

默认 MAC 地址:a1:b2:c3:d4:e5:f6

所有网卡 IPv4:['192.168.1.105', '192.168.3.26']

优缺点

  • ✅ 优点:零依赖、代码简洁、快速上手

  • ❌ 缺点:无法对应 "网卡名 - IP-MAC" 三者关系,多网卡场景信息不完整

四、方案 2:netifaces 库(推荐,多网卡完美支持)

netifaces 是专门用于获取网络接口信息的第三方库,跨平台兼容,能精准获取每个网卡的完整信息,是多网卡场景的最优选择。

1. 安装依赖

复制代码
# PyPI 安装(推荐)

pip install netifaces

# 若 Windows 安装失败,可使用 conda 安装

# conda install -c conda-forge netifaces

2. 完整代码(获取所有网卡详细信息)

复制代码
import netifaces

def get_all_network_adapters():

   """

   获取本机所有网卡的完整信息(IP+MAC+网卡名+子网掩码)

   返回格式:list[dict],每个字典对应一个有效网卡

   """

   network_adapters = []

   # 获取所有网卡接口名称(如 eth0、WLAN、以太网等)

   all_interfaces = netifaces.interfaces()

   for interface in all_interfaces:

       adapter_info = {

           "网卡名称": interface,

           "IPv4 地址": None,

           "子网掩码": None,

           "MAC 地址": None

       }

       # 1. 获取 MAC 地址(AF_LINK 对应链路层,即 MAC 地址)

       try:

           link_info = netifaces.ifaddresses(interface)[netifaces.AF_LINK][0]

           adapter_info["MAC 地址"] = link_info["addr"]

       except (KeyError, IndexError):

           # 部分虚拟网卡可能无 MAC 地址,忽略异常

           adapter_info["MAC 地址"] = "无"

       # 2. 获取 IPv4 地址和子网掩码(AF_INET 对应 IPv4 协议)

       try:

           inet_info = netifaces.ifaddresses(interface)[netifaces.AF_INET][0]

           adapter_info["IPv4 地址"] = inet_info["addr"]

           adapter_info["子网掩码"] = inet_info["netmask"]

       except (KeyError, IndexError):

           # 无 IPv4 地址的网卡(如虚拟网卡、未连接的网卡),忽略

           adapter_info["IPv4 地址"] = "无"

           adapter_info["子网掩码"] = "无"

       # 过滤无效网卡(无 IPv4 且无 MAC 的虚拟接口)

       if adapter_info["IPv4 地址"] != "无" or adapter_info["MAC 地址"] != "无":

           network_adapters.append(adapter_info)

   return network_adapters

def print_network_info(adapters):

   """格式化输出网卡信息"""

   print("=== 本机所有网卡详细信息(netifaces 方案)===\n")

   for idx, adapter in enumerate(adapters, 1):

       print(f"【网卡 {idx}】")

       for key, value in adapter.items():

           print(f"  {key}:{value}")

       print("-" * 50)

if __name__ == "__main__":

   adapters = get_all_network_adapters()

   print_network_info(adapters)

运行效果

复制代码
=== 本机所有网卡详细信息(netifaces 方案)===

【网卡 1】

 网卡名称:以太网

 IPv4 地址:192.168.1.105

 子网掩码:255.255.255.0

 MAC 地址:a1:b2:c3:d4:e5:f6

--------------------------------------------------

【网卡 2】

 网卡名称:WLAN

 IPv4 地址:192.168.3.26

 子网掩码:255.255.255.0

 MAC 地址:b2:c3:d4:e5:f6:a7

--------------------------------------------------

【网卡 3】

 网卡名称:虚拟机网卡

 IPv4 地址:192.168.100.5

 子网掩码:255.255.255.0

 MAC 地址:c3:d4:e5:f6:a7:b8

--------------------------------------------------

核心 API 说明

  • netifaces.interfaces():返回所有网卡接口名称列表

  • netifaces.ifaddresses(interface):返回指定网卡的所有地址信息(字典格式)

    • netifaces.AF_LINK:链路层地址(MAC 地址)

    • netifaces.AF_INET:IPv4 地址信息

    • netifaces.AF_INET6:IPv6 地址信息(如需支持,可参考 IPv4 逻辑扩展)

优缺点

  • ✅ 优点:信息完整、多网卡精准匹配、跨平台稳定、易用性强

  • ❌ 缺点:需要额外安装第三方库(仅需一行命令)

五、方案 3:系统命令调用(无依赖,兼容所有环境)

通过调用系统原生命令(Windows ipconfig /all、Linux/Mac ifconfig -a),解析输出结果获取 IP 和 MAC,适合无法安装第三方库的场景。

完整代码

复制代码
import subprocess

import re

import sys

def get_ip_mac_by_system_cmd():

   """

   调用系统命令获取 IP 和 MAC 地址(跨平台兼容)

   返回格式:list[dict]

   """

   ip_mac_list = []

   try:

       if sys.platform == "win32":

           # Windows 系统:执行 ipconfig /all,编码用 gbk(避免中文乱码)

           result = subprocess.check_output(

               "ipconfig /all",

               shell=True,

               encoding="gbk",

               stderr=subprocess.STDOUT

           )

           # 正则匹配:网卡名称、IPv4、MAC(物理地址)

           adapter_pattern = r"(Ethernet adapter|Wireless LAN adapter).*?:(.*?)(?=\n\n|\Z)"

           adapters = re.findall(adapter_pattern, result, re.DOTALL)

          

           for adapter_type, adapter_content in adapters:

               # 提取网卡名称(如 "以太网"、"WLAN")

               name_match = re.search(r"([^:]+)", adapter_content.strip())

               name = name_match.group(1) if name_match else adapter_type

              

               # 提取 IPv4 地址

               ip_match = re.search(r"IPv4 地址.*?: ([\d.]+)", adapter_content)

               ip = ip_match.group(1) if ip_match else "无"

              

               # 提取 MAC 地址(物理地址)

               mac_match = re.search(r"物理地址.*?: ([0-9A-Fa-f-]+)", adapter_content)

               mac = mac_match.group(1).replace("-", ":") if mac_match else "无"

              

               if ip != "无" and not ip.startswith("127."):

                   ip_mac_list.append({

                       "网卡名称": name,

                       "IPv4 地址": ip,

                       "MAC 地址": mac

                   })

      

       else:

           # Linux/Mac 系统:执行 ifconfig -a,编码用 utf-8

           result = subprocess.check_output(

               "ifconfig -a",

               shell=True,

               encoding="utf-8",

               stderr=subprocess.STDOUT

           )

           # 正则匹配:网卡名、MAC(ether)、IPv4(inet)

           interface_pattern = r"(\w+):.*?ether ([0-9a-f:]+).*?inet ([\d.]+)", re.DOTALL

           matches = re.findall(interface_pattern, result)

          

           for name, mac, ip in matches:

               if not ip.startswith("127."):

                   ip_mac_list.append({

                       "网卡名称": name,

                       "IPv4 地址": ip,

                       "MAC 地址": mac

                   })

  

   except Exception as e:

       print(f"获取失败:{str(e)}")

  

   return ip_mac_list

if __name__ == '__main__':

   print("=== 本机网络信息(系统命令方案)===\n")

   network_info = get_ip_mac_by_system_cmd()

   for idx, info in enumerate(network_info, 1):

       print(f"【网卡 {idx}】")

       for key, value in info.items():

           print(f"  {key}:{value}")

       print("-" * 50)

运行效果(Windows 示例)

复制代码
=== 本机网络信息(系统命令方案)===

【网卡 1】

 网卡名称:以太网

 IPv4 地址:192.168.1.105

 MAC 地址:a1:b2:c3:d4:e5:f6

--------------------------------------------------

【网卡 2】

 网卡名称:WLAN

 IPv4 地址:192.168.3.26

 MAC 地址:b2:c3:d4:e5:f6:a7

--------------------------------------------------

优缺点

  • ✅ 优点:零依赖、兼容所有系统、无需额外安装

  • ❌ 缺点:需要解析命令输出(正则易受系统语言影响)、信息不如 netifaces 完整

六、关键注意事项

  1. 权限问题
  • Linux/Mac 系统中,部分网卡信息可能需要 sudo 权限(如 ifconfig -a),建议运行时添加 sudo

  • Windows 系统无需管理员权限,直接运行即可。

  1. 虚拟网卡过滤
  • 虚拟机(VMware、VirtualBox)、Docker 等会创建虚拟网卡,代码中已过滤无 IP 的无效网卡,可根据需求调整过滤逻辑。
  1. 编码问题
  • Windows 的 ipconfig /all 输出为 GBK 编码,需指定 encoding="gbk" 避免中文乱码。

  • Linux/Mac 的 ifconfig 输出为 UTF-8 编码,指定 encoding="utf-8" 即可。

  1. IPv6 支持
  • 若需获取 IPv6 地址,可扩展 netifaces.AF_INET6(方案 2)或调整正则表达式(方案 3),逻辑与 IPv4 类似。
相关推荐
qq_283720053 小时前
Python 操作 MySQL 数据库全解:增删改查、事务、连接池与性能优化
数据库·python·mysql
Leinwin3 小时前
实战教程:3步接入Azure OpenAI调用GPT-5,国内IP直连
后端·python·flask
爱码小白3 小时前
MySQL 系统函数专项练习题
数据库·python·mysql
傻啦嘿哟3 小时前
Python 实现 Excel 数据可视化:柱状图制作教程
开发语言·python
ZC跨境爬虫3 小时前
海南大学交友平台登录页开发实战day3(解决python传输并读取登录信息的问题)
前端·数据库·python·html
2601_954434553 小时前
2026年电钢琴品牌专业深度测评:排名前五权威榜单发布
大数据·人工智能·python
威联通网络存储3 小时前
非结构化数据治理:底层全文检索与自动化归档解析
运维·python·自动化·全文检索
满满和米兜3 小时前
【Java基础】- 集合 - ArrayList与LinkedList
java·python·算法
沪漂阿龙3 小时前
PyTorch 张量与自动微分完全指南:从核心概念到实战训练
人工智能·pytorch·python