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大同小异。
三种方法,各有千秋。从快速验证到生产部署,从简单获取到深度挖掘,总有一款适合你。希望这份梳理能帮你下次在需要获取网卡信息时,不再纠结。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
centos上golang打包的文件如何分发
在CentOS上使用Golang打包的应用程序可以通过以下步骤进行分发 把Golang应用从开发环境搬到生产服务器,这事儿说简单也简单,但想做得规范、可靠,还真有几个关键步骤得走对。下面这份操作指南,能帮你把打包好的程序稳稳当当地部署到CentOS系统上。 1 打包应用程序 首先,在你的CentO
centos上golang打包后的文件在哪
在 CentOS 上定位 Go 语言编译后的可执行文件 在 CentOS 系统上使用 Go 语言完成编译打包后,生成的可执行文件到底藏在哪里?这是很多开发者,尤其是刚接触 Go 的新手,会遇到的第一个实操问题。其实,答案比你想象的要直接。 简单来说,如果你没有特别指定输出路径,这个文件通常就安静地躺
如何在CentOS设置Golang日志
在CentOS上为Golang应用配置日志:一份实操指南 为运行在CentOS服务器上的Golang应用程序建立一个可靠的日志系统,是确保应用可观测性和后期排障的基础。下面这份分步指南,将带你完成从环境准备到日志落地的全过程。 第一步:安装Golang运行环境 如果系统尚未安装Golang,需要先进
如何自动化处理CentOS PHP日志
自动化处理 CentOS PHP 日志的实用方案 让系统日志管理自动化,是提升运维效率的关键一步。针对 CentOS 上的 PHP 日志,通常可以通过组合系统工具与自定义脚本的方式来实现。下面介绍两种核心方法,你可以根据实际场景灵活选用或结合。 1 使用 logrotate 工具进行日志轮转 首先
CentOS Golang日志如何归档
在 CentOS 上实现 Golang 日志归档的几种实用方法 对于在 CentOS 上运行的 Golang 应用来说,日志管理是个绕不开的话题。尤其是日志归档,直接关系到后续的问题排查和系统审计。那么,具体有哪些行之有效的方案呢?其实主要可以从系统工具、代码层面和服务管理三个方向入手。 1 使用
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

