You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python的psutil获取网卡名称及对应IP、子网掩码、MAC地址

解决psutil获取网卡IP、子网掩码、MAC地址的问题

我完全懂你碰到的困惑——psutil的net_if_addrs()返回的数据结构确实有点绕,刚开始用很容易只拿到网卡名称,摸不着怎么取具体地址。别着急,我给你一步步拆解怎么正确提取你要的信息:

首先得搞清楚psutil.net_if_addrs()的返回结构:它是一个字典,键是网卡的名称(比如EthernetWi-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()  # 用空行分隔不同网卡的信息

关键细节说明

  1. items()遍历字典network_interfaces.items()会同时返回网卡名称(键)和对应的地址列表(值),这比单独遍历键再通过network_interfaces[iface_name]取值要更清晰高效。
  2. 判断地址类型addr.family是区分地址类型的关键:
    • psutil.AF_INET:对应IPv4地址,这时候addr.address是IP,addr.netmask是子网掩码
    • psutil.AF_LINK:对应MAC地址,addr.address就是网卡的物理地址
    • psutil.AF_INET6:对应IPv6地址,如果需要可以自行添加判断
  3. 过滤无效网卡:有些系统里会存在虚拟网卡、禁用的网卡,这类网卡可能没有IPv4或MAC地址,你可以根据需求加判断(比如只输出有IPv4地址的网卡)。

常见问题排查

如果还是拿不到数据,可能是这两个原因:

  • 权限不足:部分Linux/macOS系统下获取MAC地址需要管理员权限,试试用sudo运行脚本
  • 网卡状态:如果网卡是禁用状态,psutil可能无法获取到它的地址信息,确保网卡是启用的

内容的提问来源于stack exchange,提问作者Park Yo Jin

火山引擎 最新活动