Windows 和 Python 获取 MAC 地址:命令行与代码的最简用法

Finn
Finn
发布时间:2026-08-22| 74人浏览过
原创
对比 Python 标准库方案与 netifaces 跨平台方案的依赖、平台和输出特征的信息图
Python 两种获取方案怎么选程序里获取 MAC 地址时,关键不是代码长短,而是平台范围和依赖接受度。
对比 Windows 下三条查询 MAC 地址命令的用途、输出特点和适用场景的信息图
Windows 命令查询方式对比把 `ipconfig /all`、`getmac` 和 `wmic` 放到同一视角下看。

前言

在设备授权、局域网联调、软件绑定机器这类场景里,MAC 地址往往是最先要拿到的一项信息。本文把 Windows 自带命令和 Python 获取本机 MAC 的两种常用写法拆开讲清楚:什么时候直接查命令行最省事,什么时候适合写进程序,以及不同方案在平台、依赖和输出格式上的差别。 如果你只是临时查看,本机命令已经够用;如果你要做自动采集或打包发布,就需要在标准库方案和跨平台依赖方案之间做取舍。看完后,你可以按自己的使用场景直接选一套可落地的方法。

在设备授权、局域网联调、软件绑定机器这类场景里,MAC 地址往往是最先要拿到的一项信息。本文把 Windows 自带命令和 Python 获取本机 MAC 的两种常用写法拆开讲清楚:什么时候直接查命令行最省事,什么时候适合写进程序,以及不同方案在平台、依赖和输出格式上的差别。

如果你只是临时查看,本机命令已经够用;如果你要做自动采集或打包发布,就需要在标准库方案和跨平台依赖方案之间做取舍。看完后,你可以按自己的使用场景直接选一套可落地的方法。

Windows 下直接查 MAC 地址

Windows 自带的命令行工具已经能完成大多数查询需求,不需要额外安装软件。区别主要在于输出信息多少,以及是否适合脚本调用。

`ipconfig /all`:信息最全,适合人工查看

如果你要同时看网卡、IP、DNS 和物理地址,最常用的还是这条命令:

ipconfig /all

在输出结果中,物理地址 就是 MAC 地址。这里要注意,必须带上 /all;直接执行 ipconfig 时,看不到 MAC 地址。

如果你只想保留 MAC 相关行,可以再做一次过滤:

ipconfig /all | findstr "物理地址"

这种方式适合本地排查,因为它保留了上下文信息,便于确认当前查看的是哪块网卡。

`getmac`:输出更直接,适合快速获取

如果目标只是尽快拿到本机网卡物理地址,getmac 会更省事:

getmac

这条命令是 Windows 自带的专用查询方式,输出比 ipconfig /all 更简洁,没有太多无关字段。临时查看时,通常可以把它作为首选。

`wmic`:更适合脚本批量读取

如果你更在意输出规整,或者要在批处理脚本里继续加工结果,可以使用:

wmic nic where "MacAddress<>null" get MacAddress

它会直接列出非空的 MacAddress 字段,结构比较适合程序继续处理。相比人工查看,这种方式更偏向脚本化使用场景。

Python 获取本机 MAC 地址的两种最简写法

如果你要把 MAC 地址读取逻辑集成到程序里,常见选择有两类:一类是直接调用 Windows 命令,零依赖;另一类是使用第三方库,换取跨平台能力。

方案一:标准库调用 `getmac`,Windows 专用且零依赖

这套写法不需要安装任何包,直接调用系统命令并解析结果,适合 Windows 环境下的快速集成和项目打包发布:

import subprocess
import re

def get_mac_list():
    res = subprocess.check_output("getmac /fo table /nh", encoding="gbk")
    macs = re.findall(r"([0-9A-Fa-f]{2}[-][0-9A-Fa-f]{2}[-][0-9A-Fa-f]{2}[-][0-9A-Fa-f]{2}[-][0-9A-Fa-f]{2}[-][0-9A-Fa-f]{2})", res)
    return list(set(macs))

if __name__ == "__main__":
    print("本机MAC地址列表:")
    print(get_mac_list())

这段代码的特点很明确:

  • 依赖只有 subprocess 和 re,都来自标准库;
  • 通过 getmac /fo table /nh 取得结果,避免额外表头干扰;
  • 用正则提取 XX-XX-XX-XX-XX-XX 格式的地址;
  • 最后通过 set 去重,返回 MAC 列表。

如果你的程序只运行在 Windows,且希望减少依赖、降低打包时的额外报错风险,这通常是最实用的一种方案。

方案二:`netifaces` 跨平台方案,适合 Windows/Linux/Mac

如果代码需要同时跑在 Windows、Linux 和 Mac 上,可以使用 netifaces:

安装命令:

pip install netifaces

对应代码如下:

import netifaces

def get_mac_list():
    macs = set()
    for iface in netifaces.interfaces():
        addrs = netifaces.ifaddresses(iface)
        if netifaces.AF_LINK in addrs:
            mac = addrs[netifaces.AF_LINK][0]['addr']
            if mac != "00:00:00:00:00:00":
                macs.add(mac)
    return list(macs)

print(get_mac_list())

这套方案的重点在于遍历所有网络接口,并从 AF_LINK 地址族中提取物理地址。代码里还特意过滤掉了 00:00:00:00:00:00,避免把无效地址带进结果里。

当你的项目存在跨平台部署需求时,这种写法会比直接调用 Windows 命令更稳妥,但代价是需要额外安装依赖。

怎么选更合适:手动查看、脚本读取还是跨平台

把几种方式放到具体场景里,选择会更清楚:

  • 临时手动查看:优先用 getmac,结果简洁,执行最快;
  • 需要完整网络上下文:用 ipconfig /all,适合顺带检查 IP、DNS 和网卡状态;
  • 批处理或脚本读取:wmic nic where "MacAddress<>null" get MacAddress 更便于后续加工;
  • Windows 项目内嵌:标准库调用 getmac,零依赖,适合打包发布;
  • Windows/Linux/Mac 通用程序:使用 netifaces。

如果你的业务里只是做设备授权、日志采集、系统信息展示,通常不需要把逻辑写得很重,上面这些最简实现已经够用。

输出格式和网卡类型需要注意什么

不同系统下,MAC 地址的表现形式并不完全一致:

  • Windows 常见格式:XX-XX-XX-XX-XX-XX
  • Linux/Mac 常见格式:XX:XX:XX:XX:XX:XX

这意味着如果你后续还要做比对、入库或设备绑定,最好先考虑是否需要统一格式。

另外,返回结果里不一定只有你当前正在使用的那张网卡。常见情况下,结果可能包含:

  • 有线网卡
  • WiFi 网卡
  • 蓝牙网卡
  • 虚拟网卡
  • 虚拟机网卡

也就是说,获取到的是“本机可见的多个网络接口地址”,而不是天然只返回一个主网卡 MAC。实际接入业务前,最好先明确你真正要绑定的是哪一类接口。

结论

想手动查看 MAC 地址,getmac 通常是最省事的选择;想看完整网络详情,用 ipconfig /all;想让程序自动读取,Windows 环境可以直接用标准库调用命令,跨平台项目则更适合 netifaces。

这几套方法都足够轻量,适合直接接进设备授权、日志采集和系统信息工具中。真正需要提前判断的,主要是平台范围、是否允许额外依赖,以及你最终要取的是哪张网卡的地址。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。