python3获取windows10电脑的所有网卡信息(网卡名字、IP、子网掩码、网关信息) 在网上找了些,但是都不符合自己的需要,自己动手获取,方法是解析cmd 的ipconfig命令内容

代码

import subprocess
import re


# 执行windows命令
def exec_command(commands) -> list:
    """执行windows命令"""
    if not commands:
        return list()
    # 子进程的标准输出设置为管道对象
    if isinstance(commands, str):
        commands = [commands]
    return_list = []
    for i in commands:
        p = subprocess.Popen(i, shell=True, stdout=subprocess.PIPE, universal_newlines=True)
        p.wait()
        res = "".join(p.stdout.readlines())
        return_list.append(res)
    return return_list


def get_net_card():
    """
    功能:通过ipconfig返回的文本解析网卡名字、ip、掩码、网关等信息
    注释:简单做了注释
    测试:在window10 专业版测试通过(可以检测到以太网两个(包含手机、网线)、wifi一个)
    测试反馈:如果使用发现其余问题可以反馈到 sunnylishaoxu@163.com,非常感谢
    说明一:
       默认网关. . . . . . . . . . . . . : fe80::10b1:1865:86e8:ad10%41
                                           172.20.10.1
    """
    net_card_data = list()
    res = exec_command("ipconfig")
    temp_dict = dict(flag=True)
    gateway_error = False
    for x in res[0].splitlines():
        # 匹配IP正则
        pattern = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}')
        # 测试发现有的网关会默认在下一行,情况见说明一,所以这边检查到默认网关,发现没有匹配到,则从下一行找
        if gateway_error:
            temp_dict['gateway1'] = pattern.search(x).group()
            gateway_error = False
            print("当前网卡 %s 获取第二行网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
            continue
        # 如果发现新的适配器,则重置上一个网卡是否可用的状态
        if "适配器" in x:
            temp_dict = dict(flag=True)
            temp_dict['card_name'] = x.split(" ",  1)[1][:-1]
            print("当前网卡 %s" % (temp_dict['card_name']))
            continue
        if "IPv4 地址" in x:
            temp_dict['ip'] = pattern.search(x).group()
            print("当前网卡 %s 获取IP信息 %s" % (temp_dict['card_name'], temp_dict['ip']))
            continue
        elif "子网掩码" in x:
            temp_dict['mask'] = pattern.search(x).group()
            print("当前网卡 %s 获取子网掩码信息 %s" % (temp_dict['card_name'], temp_dict['mask']))
            continue
        # 测试发现有的网关会默认在下一行,情况见说明一,所以这边做了异常处理
        elif "默认网关" in x:
            try:
                temp_dict['gateway1'] = pattern.search(x).group()
                print("当前网卡 %s 获取默认网关信息 %s" % (temp_dict['card_name'], temp_dict['gateway1']))
            except:
                gateway_error = True
                print("当前网卡 %s 解析当前行默认网关信息错误" % (temp_dict['card_name']))

            # 如果检查到网关,代表当前适配器信息已经获取完毕 重置网关状态与适配器信息字典
            if temp_dict.get("gateway1"):
                net_card_data.append(temp_dict)
                print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))

                temp_dict = dict(flag=True)
                continue
        # 发现媒体已断开则更改当前适配器状态
        elif "媒体已断开" in x:
            print("当前网卡 %s 已断开 跳过\n\n" % (temp_dict['card_name']))
            temp_dict['flag'] = False
            continue
        # 判断媒体状态正常,IP、子网掩码、网关都正常后,保持起来
        if temp_dict.get("flag") and temp_dict.get("ip") and temp_dict.get("mask") and temp_dict.get("gateway1"):
            print("当前网卡 %s 当前适配器信息获取完毕 %s \n\n" % (temp_dict['card_name'], temp_dict))
            net_card_data.append(temp_dict)
            # 重置网关状态与适配器信息字典
            temp_dict = dict(flag=True)
            continue
    for i in net_card_data:
        print("%s%s" % (i.get("card_name"), i))
    return net_card_data


get_net_card()

运行结果:

当前网卡 以太网
当前网卡 以太网 获取IP信息 192.168.1.146
当前网卡 以太网 获取子网掩码信息 255.255.255.0
当前网卡 以太网 获取默认网关信息 192.168.1.1
当前网卡 以太网 当前适配器信息获取完毕 {'flag': True, 'card_name': '以太网', 'ip': '192.168.1.146', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'} 
当前网卡 本地连接* 9
当前网卡 本地连接* 9 已断开 跳过
当前网卡 本地连接* 10
当前网卡 本地连接* 10 已断开 跳过
当前网卡 以太网 3
当前网卡 以太网 3 获取IP信息 172.20.10.3
当前网卡 以太网 3 获取子网掩码信息 255.255.255.240
当前网卡 以太网 3 解析当前行默认网关信息错误
当前网卡 以太网 3 获取第二行网关信息 172.20.10.1
当前网卡 以太网 3 当前适配器信息获取完毕 {'flag': True, 'card_name': '以太网 3', 'ip': '172.20.10.3', 'mask': '255.255.255.240', 'gateway1': '172.20.10.1'} 
当前网卡 WLAN
当前网卡 WLAN 获取IP信息 192.168.1.114
当前网卡 WLAN 获取子网掩码信息 255.255.255.0
当前网卡 WLAN 获取默认网关信息 192.168.1.1
当前网卡 WLAN 当前适配器信息获取完毕 {'flag': True, 'card_name': 'WLAN', 'ip': '192.168.1.114', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'} 
当前网卡 蓝牙网络连接
当前网卡 蓝牙网络连接 已断开 跳过
以太网:{'flag': True, 'card_name': '以太网', 'ip': '192.168.1.146', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'}
以太网 3{'flag': True, 'card_name': '以太网 3', 'ip': '172.20.10.3', 'mask': '255.255.255.240', 'gateway1': '172.20.10.1'}
WLAN:{'flag': True, 'card_name': 'WLAN', 'ip': '192.168.1.114', 'mask': '255.255.255.0', 'gateway1': '192.168.1.1'}