本文详解 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 类似。
以上就是python获取本机所有网卡ip/mac地址的三种方法的详细内容,更多关于python获取本机网卡ip/mac地址的资料请关注代码网其它相关文章!
发表评论