当前位置: 代码网 > it编程>前端脚本>Python > Python获取本机所有网卡IP/MAC地址的三种方法

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

2026年04月22日 Python 我要评论
本文详解 3 种 python 实现方案,支持windows/linux/macos跨平台,完美适配多网卡场景,可直接获取所有网络适配器的 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 类似。

以上就是python获取本机所有网卡ip/mac地址的三种方法的详细内容,更多关于python获取本机网卡ip/mac地址的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com