如何用Python的psutil获取网卡名称及对应IP、子网掩码、MAC地址
解决psutil获取网卡IP、子网掩码、MAC地址的问题
我完全懂你碰到的困惑——psutil的net_if_addrs()返回的数据结构确实有点绕,刚开始用很容易只拿到网卡名称,摸不着怎么取具体地址。别着急,我给你一步步拆解怎么正确提取你要的信息:
首先得搞清楚psutil.net_if_addrs()的返回结构:它是一个字典,键是网卡的名称(比如Ethernet、Wi-Fi),而对应的值不是单个字符串,而是一个包含snicaddr对象的列表——每个对象对应网卡的一种地址类型(IPv4、IPv6、MAC等)。所以你直接遍历字典的键肯定拿不到具体地址,得同时遍历键和值,再处理每个地址对象。
完整可运行代码示例
import psutil # 获取所有网卡的地址信息集合 network_interfaces = psutil.net_if_addrs() # 遍历每个网卡及其对应的地址列表 for iface_name, addr_list in network_interfaces.items(): print(f"--- 网卡: {iface_name} ---") for addr in addr_list: # 根据地址类型提取对应信息 if addr.family == psutil.AF_INET: print(f"IPv4地址: {addr.address}") print(f"子网掩码: {addr.netmask}") elif addr.family == psutil.AF_LINK: print(f"MAC地址: {addr.address}") # 如果需要IPv6,可以加上下面的判断 # elif addr.family == psutil.AF_INET6: # print(f"IPv6地址: {addr.address}") print() # 用空行分隔不同网卡的信息
关键细节说明
- 用
items()遍历字典:network_interfaces.items()会同时返回网卡名称(键)和对应的地址列表(值),这比单独遍历键再通过network_interfaces[iface_name]取值要更清晰高效。 - 判断地址类型:
addr.family是区分地址类型的关键:psutil.AF_INET:对应IPv4地址,这时候addr.address是IP,addr.netmask是子网掩码psutil.AF_LINK:对应MAC地址,addr.address就是网卡的物理地址psutil.AF_INET6:对应IPv6地址,如果需要可以自行添加判断
- 过滤无效网卡:有些系统里会存在虚拟网卡、禁用的网卡,这类网卡可能没有IPv4或MAC地址,你可以根据需求加判断(比如只输出有IPv4地址的网卡)。
常见问题排查
如果还是拿不到数据,可能是这两个原因:
- 权限不足:部分Linux/macOS系统下获取MAC地址需要管理员权限,试试用
sudo运行脚本 - 网卡状态:如果网卡是禁用状态,psutil可能无法获取到它的地址信息,确保网卡是启用的
内容的提问来源于stack exchange,提问作者Park Yo Jin




