在设备授权、局域网联调、软件绑定机器这类场景里,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。
这几套方法都足够轻量,适合直接接进设备授权、日志采集和系统信息工具中。真正需要提前判断的,主要是平台范围、是否允许额外依赖,以及你最终要取的是哪张网卡的地址。











