Python实现获取本机网卡的MAC地址,IP地址和路由表

 更新时间:2026年05月08日 09:13:23   作者:SAPmatinal  
本文主要为大家详细介绍了如何在Windows和Mac系统下获取本机MAC地址和IP地址的方法,以及如何使用ARP协议获取局域网内所有计算机的IP地址与MAC地址,感兴趣的小伙伴可以了解下

一、获取Mac地址

1、单个网卡

>>> import uuid
>>> address = hex(uuid.getnode())[2:]
>>> '-'.join(address[i:i+2] for i in range(0, len(address), 2))
'f0-03-8c-09-8c-34'

2、获取多网卡MAC地址

使用pip安装Python扩展库psutil,运行以下的代码:

from psutil import net_if_addrs
for k, v in net_if_addrs().items():
    for item in v:
        address = item[1]
        if '-' in address and len(address)==17:
            print(address)

二、获取本机IP地址

1、windows下:

Python标准库socket中有可以获取本机IPV4地址的方法,下面是网上非常常见的一种用法:

>>> import socket
>>> hostname = socket.gethostname()
>>> hostname
'DESKTOP-I734J3O'
>>> socket.gethostbyname(hostname)
'192.168.0.103'

2、Mac下:

上面的代码在Windows下运行良好,但是无意中发现在Mac系统下运行不正常,返回的是本机回环地址127.0.0.1,而不是真正的IP地址。经过查阅大量资料,终于发现socket模块中另一个函数的妙用,那就是getaddrinfo()函数,该函数用法为getaddrinfo(host, port, family=0, type=0, proto=0, flags=0),返回值是一个五元组的列表,该五元组形式为(family, type, proto, canonname, sockaddr),其中最后一个元素sockaddr对于IPV4协议是(IP address, port)形式的元组,而对于IPV6协议是(address, port, flow info, scope id)形式的元组,也就是说,不管是IPV4还是IPV6,上面的函数都可以正确地获取IP地址。
于是,继续上面的代码:

>>> addrs = socket.getaddrinfo(hostname,None)
>>> for item in addrs:
     print(item)
(, 0, 0, '', ('fe80::b976:b065:27d:3747%10', 0, 0, 10))
(, 0, 0, '', ('fe80::1456:951:2418:27cf%7', 0, 0, 7))
(, 0, 0, '', ('192.168.0.103', 0))
(, 0, 0, '', ('2001:0:9d38:6ab8:1456:951:2418:27cf', 0, 0, 0))

如此便可以获取本机所有IPV4和IPV6地址,如果只想获取IPV4地址,再继续执行下面的代码:

>>> [item[4][0] for item in addrs if ':' not in item[4][0]][0]
'192.168.0.103'

三、路由表

方法:采用ARP协议获取局域网内所有计算机的IP地址与MAC地址,思路是使用系统命令arp获取ARP表并生成文本文件,然后从文件中读取和解析信息。

import os
from socket import gethostbyname, gethostname

 获取本机IP地址

host = gethostbyname(gethostname())

获取ARP表

os.system('arp -a > temp.txt')
with open('temp.txt') as fp:
    for line in fp:
        line = line.split()[:2]
        if line and\
           line[0].startswith(host[:4]) and\
           (not line[0].endswith('255')):
            print(':'.join(line))

四、方法补充

在 Python 中获取本机网卡的 MAC 地址、IP 地址和路由表,可以使用跨平台库 psutil 和 netifaces,同时结合系统命令作为备选方案。下面给出完整的实现示例。

安装所需库

pip install psutil netifaces

psutil 用于获取网卡信息(MAC、IP),netifaces 用于获取路由表(网关等)。

获取所有网卡的 MAC 地址和 IP 地址

使用 psutil.net_if_addrs() 可以获取每个网卡的所有地址(包括 IPv4、IPv6、MAC 等)。

import psutil
def get_network_interfaces():
    """获取所有网卡的 MAC 地址和 IPv4 地址"""
    interfaces = {}
    for iface, addrs in psutil.net_if_addrs().items():
        # 跳过虚拟、回环等无用网卡(可根据需要调整)
        if iface.startswith(('lo', 'Loopback', 'vEthernet', 'docker', 'vboxnet')):
            continue
        mac = None
        ipv4 = None
        for addr in addrs:
            if addr.family == psutil.AF_LINK:   # MAC 地址
                mac = addr.address
            elif addr.family == socket.AF_INET: # IPv4 地址
                ipv4 = addr.address
        if mac or ipv4:
            interfaces[iface] = {'mac': mac, 'ipv4': ipv4}
    return interfaces
if __name__ == '__main__':
    import socket
    for name, info in get_network_interfaces().items():
        print(f"网卡: {name}")
        print(f"  MAC地址: {info['mac']}")
        print(f"  IPv4地址: {info['ipv4']}")

输出示例

网卡: eth0
  MAC地址: 00:15:5d:01:02:03
  IPv4地址: 192.168.1.100

获取路由表

获取路由表在不同操作系统上的方法不同。推荐使用 netifaces 获取默认网关,或调用系统命令获取详细路由表。

方法1:使用 netifaces 获取默认网关及路由条目

import netifaces
def get_gateways():
    """获取默认网关"""
    gateways = netifaces.gateways()
    default = gateways['default']
    print("默认网关:")
    for family, (gw, iface) in default.items():
        print(f"  协议: {family}, 网关: {gw}, 网卡: {iface}")
def get_routing_table():
    """获取路由表(Linux/Unix 使用 /proc/net/route,Windows 调用 route print)"""
    import platform
    import subprocess
    system = platform.system()
    if system == 'Linux':
        # 解析 /proc/net/route
        with open('/proc/net/route', 'r') as f:
            lines = f.readlines()[1:]  # 跳过标题行
            print("路由表 (Linux):")
            for line in lines:
                parts = line.strip().split()
                if len(parts) >= 4:
                    iface = parts[0]
                    dest = int(parts[1], 16)
                    gateway = int(parts[2], 16)
                    # 转换 IP 格式
                    import socket, struct
                    dest_ip = socket.inet_ntoa(struct.pack('<L', dest))
                    gw_ip = socket.inet_ntoa(struct.pack('<L', gateway))
                    print(f"  {iface} -> 目标: {dest_ip}, 网关: {gw_ip}")
    elif system == 'Windows':
        # 调用 route print 命令
        result = subprocess.run(['route', 'print'], capture_output=True, text=True)
        print(result.stdout)
    else:
        print("不支持的系统,请使用 netstat -rn 命令查看")
if __name__ == '__main__':
    get_gateways()
    get_routing_table()

注意:在 Windows 上,netifaces.gateways() 可能返回空字典,需要管理员权限才能获取真实路由表。上面的 get_routing_table() 通过调用 route print 命令解决。

完整示例(跨平台)

以下代码整合了获取 MAC/IP 以及路由信息(简单显示默认网关和部分路由):

import psutil
import netifaces
import socket
import platform
import subprocess
def get_network_interfaces():
    """返回所有活动网卡的名称、MAC、IPv4"""
    interfaces = {}
    for iface, addrs in psutil.net_if_addrs().items():
        # 跳过常见虚拟/回环设备
        skip = ('lo', 'Loopback', 'vEthernet', 'docker', 'vboxnet', 'VMware', 'Virtual')
        if iface.startswith(skip):
            continue
        mac = None
        ipv4 = None
        for addr in addrs:
            if addr.family == psutil.AF_LINK:
                mac = addr.address
            elif addr.family == socket.AF_INET:
                ipv4 = addr.address
        if mac or ipv4:
            interfaces[iface] = {'mac': mac, 'ipv4': ipv4}
    return interfaces
def get_default_gateway():
    """获取默认网关(跨平台)"""
    try:
        gateways = netifaces.gateways()
        default = gateways.get('default', {})
        if default:
            # 典型结构:{2: ('192.168.1.1', 'eth0')}
            for family, (gw, iface) in default.items():
                if family == socket.AF_INET:
                    return gw, iface
    except Exception:
        pass
    # 备选方案:调用系统命令
    system = platform.system()
    if system == 'Windows':
        result = subprocess.run(['route', 'print', '0.0.0.0'], capture_output=True, text=True)
        # 简单解析(实际可以更严谨)
        for line in result.stdout.splitlines():
            if '0.0.0.0' in line and '255.255.255.0' in line:
                parts = line.split()
                if len(parts) >= 3:
                    return parts[2], parts[-1]
    elif system == 'Linux':
        with open('/proc/net/route', 'r') as f:
            for line in f:
                parts = line.strip().split()
                if len(parts) >= 4 and parts[1] == '00000000':  # 目标 0.0.0.0
                    import struct, socket
                    gateway = socket.inet_ntoa(struct.pack('<L', int(parts[2], 16)))
                    return gateway, parts[0]
    return None, None
if __name__ == '__main__':
    print("=== 网卡信息 ===")
    ifaces = get_network_interfaces()
    for name, info in ifaces.items():
        print(f"{name}: MAC={info['mac']}, IPv4={info['ipv4']}")
    print("\n=== 默认网关 ===")
    gw, iface = get_default_gateway()
    print(f"网关: {gw}, 网卡: {iface}")
    print("\n=== 完整路由表(简要) ===")
    # 直接调用系统路由表显示命令
    if platform.system() == 'Windows':
        subprocess.run(['route', 'print'], shell=True)
    else:
        subprocess.run(['route', '-n'], shell=True)

注意事项

  • 权限问题:在 Windows 上获取完整路由表可能需要以管理员身份运行 Python 脚本。
  • 虚拟网卡:自动跳过了常见虚拟设备(如 Docker、VMware),如需获取可删除 skip 判断。
  • IPv6 地址:上述代码只获取 IPv4,需要 IPv6 可增加 addr.family == socket.AF_INET6 判断。
  • 跨平台psutil 和 netifaces 在 Linux/Windows/macOS 上均可工作,但路由表解析部分需要区分系统。

到此这篇关于Python实现获取本机网卡的MAC地址,IP地址和路由表的文章就介绍到这了,更多相关Python获取网卡MAC地址内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python数据可视化绘图实例详解

    Python数据可视化绘图实例详解

    数据可视化是指用图形或表格的方式来呈现数据。图表能够清楚地呈现数据性质, 以及数据间或属性间的关系。本文为大家分享了几个Python数据可视化绘图的实例,感兴趣的可以了解一下
    2022-05-05
  • 浅谈Python中的作用域规则和闭包

    浅谈Python中的作用域规则和闭包

    本文简单讲解了PYTHON的闭包,作用域的基本知识配合实例简单明了,适合初学者
    2018-03-03
  • python处理PHP数组文本文件实例

    python处理PHP数组文本文件实例

    这篇文章主要介绍了python处理PHP数组文本文件实例,本文的PHP数组文本是多个redis数据库的配置文件,需求是提取相关参数组合成Shell命令,需要的朋友可以参考下
    2014-09-09
  • 对numpy中二进制格式的数据存储与读取方法详解

    对numpy中二进制格式的数据存储与读取方法详解

    今天小编就为大家分享一篇对numpy中二进制格式的数据存储与读取方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)

    Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境详细过程(2023最新攻略)

    这篇文章主要介绍了Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 对Tensorflow中的矩阵运算函数详解

    对Tensorflow中的矩阵运算函数详解

    今天小编就为大家分享一篇对Tensorflow中的矩阵运算函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python神经网络facenet人脸检测及keras实现

    python神经网络facenet人脸检测及keras实现

    这篇文章主要为大家介绍了python神经网络facenet人脸检测及keras实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 详解Python中的路径问题

    详解Python中的路径问题

    这篇文章主要介绍了Python中的路径问题,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-09-09
  • 基于Python制作一个端午节相关的小游戏

    基于Python制作一个端午节相关的小游戏

    端午节快乐,今天我将为大家带来一篇有关端午节的编程文章,希望能够为大家献上一份小小的惊喜,我们将会使用Python来实现一个与端午粽子相关的小应用程序,在本文中,我将会介绍如何用Python代码制做一个“粽子拆解器”,感兴趣的小伙伴欢迎阅读
    2023-06-06
  • Python中如何获取类属性的列表

    Python中如何获取类属性的列表

    这篇文章主要给大家介绍了在Python中如何获取类属性的列表,文中通过示例代码介绍的很详细,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以参考借鉴,下面来一起看看吧。
    2016-12-12

最新评论