欢迎光临
我们一直在努力

Python 获取本机所有网卡 IP/MAC 地址

本文详解 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 类似。
    赞(0)
    未经允许不得转载:171主机测评 » Python 获取本机所有网卡 IP/MAC 地址
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址