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自带的socket和uuid模块就能搞定基础需求。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命令的环境它都能上。
❌ 代价则是需要自己动手解析命令行那杂乱无章的文本输出,正则表达式写得不好就容易翻车。而且,命令输出的格式可能因系统语言或版本不同而有细微差别,稳定性上不如专用库。
六、关键注意事项
方案选好了,用的时候还有几个坑得提前知道。
- 权限问题:
在Linux或Mac系统下,执行ifconfig -a这类底层网络命令通常需要sudo权限。如果你的脚本跑不起来,记得前面加上sudo。Windows用户就比较省心,一般直接运行就行。 - 虚拟网卡过滤:
现在谁的电脑上没几个虚拟机或者Docker创建的虚拟网卡?这些虚拟接口往往没有实际IP。上面的代码已经做了基础过滤,但如果你有特殊需求,比如就想看虚拟网卡,记得调整一下过滤逻辑。 - 编码问题:
这是调用系统命令时的一个经典陷阱。Windows的ipconfig输出默认是GBK编码,代码里必须指定encoding="gbk",否则中文网卡名会变成乱码。而Linux和Mac的ifconfig输出通常是UTF-8,对应改过来就好。 - IPv6 支持:
随着网络演进,IPv6越来越常见。如果需要获取IPv6地址,在方案二里可以查netifaces.AF_INET6这个键值;在方案三里,则需要调整正则表达式来匹配IPv6的格式。扩展思路和IPv4大同小异。
三种方法,各有千秋。从快速验证到生产部署,从简单获取到深度挖掘,总有一款适合你。希望这份梳理能帮你下次在需要获取网卡信息时,不再纠结。
相关攻略
随着数字化转型的加速,RPA(机器人流程自动化)和Python成为了各行各业的重要工具。然而,对于很多人来说,选择RPA还是Python是一个难题。本文将从性能、可定制性、可扩展性等方面对两者进行比较,以帮助您做出决策。 一、性能 说起性能,得先看它们各自擅长做什么。RPA的核心能力,在于搞定那些基
Python字符串定义全解析:单引号、双引号与三引号的正确用法 在Python编程中,字符串是用于表示文本数据的基本数据类型,它本质上是一个由字符组成的序列。要创建一个字符串,我们需要使用特定的引号将字符内容“包裹”起来。本文将系统讲解Python中单引号(‘ ’)、双引号(“ ”)以及三引号(
Python获取本机所有网卡IP MAC地址的三种方法 在Windows、Linux、MacOS三大主流操作系统上,如何用Python精准获取所有网络适配器的信息?今天要聊的这三种方案,完美适配多网卡场景,不仅能拿到IP和MAC地址,连网卡名称、子网掩码这些细节也一并搞定。代码都是开箱即用的,直接复
Python2移植Python3工具 说到将老旧的Python 2代码迁移到Python 3,有一个工具几乎是绕不开的,那就是2to3。它就像是官方提供的“代码翻译官”,能帮你自动处理许多语法上的差异。 2to3 这个工具用起来相当直观。最基本的功能,就是先让它帮你“看看”代码需要怎么改。 显示
Python语言下网络爬虫概述 Python语言发展 说到处理网络数据,Python这位“多面手”绝对是当下的明星。作为一种高级编程语言,它不仅能轻松驾驭网络协议、数据库交互,更在云计算与大数据浪潮中,成为了应对海量数据抓取需求的一把利器。这无疑对背后的搜索引擎技术提出了更高要求。而Python的优
热门专题
热门推荐
平安夜给朋友的搞笑祝福语 还在为平安夜的祝福语千篇一律而发愁吗?想给朋友来点不一样的惊喜?没问题,这里为你整理了一份专属于朋友的、轻松搞怪的平安夜祝福语合集,保证让你的问候脱颖而出。 1 平安夜,报平安。如果今晚有一段祥和的旋律悄悄流过你的梦境,那可能是我翻山越岭、潜入梦乡的痕迹……今晚务必做个好
平安夜给妹妹的祝福语 平安夜就在眼前,想必你正为如何向妹妹传递心意而思量。一份恰到好处的祝福,最能温暖人心。这里为你精心整理了一份祝福语合集,希望能帮你把那份独特的牵挂与美好,准确送达。 1 将“平安”二字拆解:这是你的心愿,也是我的期盼,两者相连,便是一个完美的“同心圆”;你的平安,我的挂念,共
亚马逊狗狗币是啥?揭开迷雾背后的真相 在加密货币的世界里,各种新名词总是层出不穷。最近,“亚马逊狗狗币”这个词时不时就在社媒和论坛里冒出来,勾起了不少人的好奇心:这难道是电商巨头亚马逊亲自下场发行的官方狗狗币?还是某种跟亚马逊绑定的新玩意儿?真相是,“亚马逊狗狗币”并非亚马逊的官方产物,它更多反映了
平安夜就要到了,想好怎么给好朋友留言了吗? 这里为你整理了一份温馨又走心的平安夜留言合集,希望能给你带来灵感。选一句最合心意的,为你的好友送上专属祝福吧! 精选平安夜祝福留言 1 星星悄悄划过夜空,就像我悄悄落下的思念。千言万语,其实只想说一句:平安夜快乐! 2 愿平安夜摇曳的烛光,能点亮你新一
平安夜祝福语精选:让温暖与欢乐在字里行间流淌 平安夜,这个充满温馨与期盼的节日,总是承载着无数美好的祝愿。无论是送给亲人、爱人还是朋友,一句真挚的祝福便能瞬间拉近彼此的距离。下面为大家整理了一系列风格多样的平安夜祝福语,希望能为你的节日问候增添灵感与暖意。 平安夜祝福语(一) 1 宝宝,平安夜又要





