当前位置: 首页
编程语言
Python获取本机所有网卡IP/MAC地址的三种方法

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

热心网友 时间:2026-04-23
转载

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

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

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在Windows、Linux、MacOS三大主流操作系统上,如何用Python精准获取所有网络适配器的信息?今天要聊的这三种方案,完美适配多网卡场景,不仅能拿到IP和MAC地址,连网卡名称、子网掩码这些细节也一并搞定。代码都是开箱即用的,直接复制就能跑起来。

一、应用场景

为什么需要获取本机网卡信息?这事儿在不少实际场景里都是刚需。比如,在多网卡的服务器上,脚本需要自动识别出哪个IP才是真正可用的出口地址。再比如,做设备授权或绑定的时候,经常需要把MAC地址和IP组合起来作为硬件的唯一标识。本地网络调试、自动化运维脚本开发,乃至设备信息采集上报系统,都离不开对网卡信息的准确抓取。

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

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

结论很明确:优先使用netifaces库。它在稳定性、信息完整性和易用性之间取得了最佳平衡。如果环境限制实在无法安装第三方库,那么退而求其次,调用系统命令也是个可行的备选方案。

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

不想装任何额外包?用Python自带的socketuuid模块就能搞定基础需求。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”这三者之间的对应关系。在多网卡环境下,你只知道有这么几个IP,却分不清哪个IP对应着哪块物理网卡,信息完整性上打了折扣。

四、方案 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,关键就两个函数:
- netifaces.interfaces():一网打尽,返回所有网卡接口的名字。
- netifaces.ifaddresses(interface):针对某个具体网卡,刨根问底,返回一个结构清晰的地址信息字典。这里面的netifaces.AF_LINK对应MAC地址,netifaces.AF_INET对应IPv4信息。如果需要IPv6,去找netifaces.AF_INET6,逻辑是相通的。

优缺点

✅ 优点几乎覆盖了所有痛点:信息完整无遗漏、多网卡精准匹配、跨平台运行稳定、API设计友好。
❌ 如果非要挑点毛病,那就是需要额外安装这个库。不过,也就是一行pip install的事,成本几乎可以忽略不计。

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

最后一招,算是“终极备胎”。思路很简单:直接让Python去调用系统自己的网络诊断命令——Windows上用ipconfig /all,Linux和Mac用ifconfig -a,然后把返回的那一大坨文本信息解析出来。这方法适合那些被严格管控、无法安装任何第三方库的生产环境。

完整代码

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
--------------------------------------------------

优缺点

✅ 最大优势就是“零依赖”,只要能跑Python命令的环境它都能上。
❌ 代价则是需要自己动手解析命令行那杂乱无章的文本输出,正则表达式写得不好就容易翻车。而且,命令输出的格式可能因系统语言或版本不同而有细微差别,稳定性上不如专用库。

六、关键注意事项

方案选好了,用的时候还有几个坑得提前知道。

  1. 权限问题
    在Linux或Mac系统下,执行ifconfig -a这类底层网络命令通常需要sudo权限。如果你的脚本跑不起来,记得前面加上sudo。Windows用户就比较省心,一般直接运行就行。
  2. 虚拟网卡过滤
    现在谁的电脑上没几个虚拟机或者Docker创建的虚拟网卡?这些虚拟接口往往没有实际IP。上面的代码已经做了基础过滤,但如果你有特殊需求,比如就想看虚拟网卡,记得调整一下过滤逻辑。
  3. 编码问题
    这是调用系统命令时的一个经典陷阱。Windows的ipconfig输出默认是GBK编码,代码里必须指定encoding="gbk",否则中文网卡名会变成乱码。而Linux和Mac的ifconfig输出通常是UTF-8,对应改过来就好。
  4. IPv6 支持
    随着网络演进,IPv6越来越常见。如果需要获取IPv6地址,在方案二里可以查netifaces.AF_INET6这个键值;在方案三里,则需要调整正则表达式来匹配IPv6的格式。扩展思路和IPv4大同小异。

三种方法,各有千秋。从快速验证到生产部署,从简单获取到深度挖掘,总有一款适合你。希望这份梳理能帮你下次在需要获取网卡信息时,不再纠结。

来源:https://www.jb51.net/python/362629q79.htm
上一篇: [PHP]查找PHP扩展

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
centos上golang打包的文件如何分发

centos上golang打包的文件如何分发

在CentOS上使用Golang打包的应用程序可以通过以下步骤进行分发 把Golang应用从开发环境搬到生产服务器,这事儿说简单也简单,但想做得规范、可靠,还真有几个关键步骤得走对。下面这份操作指南,能帮你把打包好的程序稳稳当当地部署到CentOS系统上。 1 打包应用程序 首先,在你的CentO

时间:2026-04-23 20:49
centos上golang打包后的文件在哪

centos上golang打包后的文件在哪

在 CentOS 上定位 Go 语言编译后的可执行文件 在 CentOS 系统上使用 Go 语言完成编译打包后,生成的可执行文件到底藏在哪里?这是很多开发者,尤其是刚接触 Go 的新手,会遇到的第一个实操问题。其实,答案比你想象的要直接。 简单来说,如果你没有特别指定输出路径,这个文件通常就安静地躺

时间:2026-04-23 20:49
如何在CentOS设置Golang日志

如何在CentOS设置Golang日志

在CentOS上为Golang应用配置日志:一份实操指南 为运行在CentOS服务器上的Golang应用程序建立一个可靠的日志系统,是确保应用可观测性和后期排障的基础。下面这份分步指南,将带你完成从环境准备到日志落地的全过程。 第一步:安装Golang运行环境 如果系统尚未安装Golang,需要先进

时间:2026-04-23 20:49
如何自动化处理CentOS PHP日志

如何自动化处理CentOS PHP日志

自动化处理 CentOS PHP 日志的实用方案 让系统日志管理自动化,是提升运维效率的关键一步。针对 CentOS 上的 PHP 日志,通常可以通过组合系统工具与自定义脚本的方式来实现。下面介绍两种核心方法,你可以根据实际场景灵活选用或结合。 1 使用 logrotate 工具进行日志轮转 首先

时间:2026-04-23 20:49
CentOS Golang日志如何归档

CentOS Golang日志如何归档

在 CentOS 上实现 Golang 日志归档的几种实用方法 对于在 CentOS 上运行的 Golang 应用来说,日志管理是个绕不开的话题。尤其是日志归档,直接关系到后续的问题排查和系统审计。那么,具体有哪些行之有效的方案呢?其实主要可以从系统工具、代码层面和服务管理三个方向入手。 1 使用

时间:2026-04-23 20:49
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程