Python获取本机所有网卡IP/MAC地址的三种方法

 更新时间:2026年04月22日 09:40:49   作者:曾阿伦  
本文详细介绍了三种Python获取网络适配器信息的解决方案,,支持Windows、Linux和Mac系统,每种方案都有其优缺点,推荐使用netifaces库,因其可以完美适配多网卡场景,需要的朋友可以参考下

本文详解 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 类似。

以上就是Python获取本机所有网卡IP/MAC地址的三种方法的详细内容,更多关于Python获取本机网卡IP/MAC地址的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Python 最短匹配模式

    详解Python 最短匹配模式

    这篇文章主要介绍了如何实现Python 最短匹配模式,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python趣味爬虫之爬取爱奇艺热门电影

    Python趣味爬虫之爬取爱奇艺热门电影

    好久没带大家实现Python爬虫了,文中有非常详细的代码示例,对不会爬虫的小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-06-06
  • Python Web框架之Django框架Model基础详解

    Python Web框架之Django框架Model基础详解

    这篇文章主要介绍了Python Web框架之Django框架Model基础,结合实例形式分析了Django框架Model模型相关使用技巧与操作注意事项,需要的朋友可以参考下
    2019-08-08
  • minconda安装pytorch的详细方法

    minconda安装pytorch的详细方法

    这篇文章主要介绍了minconda安装pytorch的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • python安装pywifi全过程

    python安装pywifi全过程

    这篇文章主要介绍了python安装pywifi全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Python实现将DOC文档转换为PDF的方法

    Python实现将DOC文档转换为PDF的方法

    这篇文章主要介绍了Python实现将DOC文档转换为PDF的方法,涉及Python调用系统win32com组件实现文件格式转换的相关技巧,需要的朋友可以参考下
    2015-07-07
  • Python中 CSV格式清洗与转换的实例代码

    Python中 CSV格式清洗与转换的实例代码

    这篇文章主要介绍了Python123 CSV格式清洗与转换的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python统计词频的几种方法小结

    Python统计词频的几种方法小结

    本文主要介绍了Python统计词频的几种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Windows下多版本Python共享Poetry测试安装

    Windows下多版本Python共享Poetry测试安装

    这篇文章主要为大家介绍了Windows下多版本Python共享Poetry的测试安装配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Python自动化处理PDF文档的完整指南

    Python自动化处理PDF文档的完整指南

    PDF是一种广泛使用的文档格式,具有跨平台、稳定性好、安全性高等特点,本文将介绍如何使用Python实现PDF文档的自动化处理,包括读写、合并拆分、提取内容、添加水印等操作,感兴趣的小伙伴可以了解下
    2026-01-01

最新评论