本文详解 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 完整
六、关键注意事项
- 权限问题:
-
Linux/Mac 系统中,部分网卡信息可能需要
sudo权限(如ifconfig -a),建议运行时添加sudo。 -
Windows 系统无需管理员权限,直接运行即可。
- 虚拟网卡过滤:
- 虚拟机(VMware、VirtualBox)、Docker 等会创建虚拟网卡,代码中已过滤无 IP 的无效网卡,可根据需求调整过滤逻辑。
- 编码问题:
-
Windows 的
ipconfig /all输出为 GBK 编码,需指定encoding="gbk"避免中文乱码。 -
Linux/Mac 的
ifconfig输出为 UTF-8 编码,指定encoding="utf-8"即可。
- IPv6 支持:
- 若需获取 IPv6 地址,可扩展
netifaces.AF_INET6(方案 2)或调整正则表达式(方案 3),逻辑与 IPv4 类似。