python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > python雷电接口检测

使用python进行雷电接口检测

作者:老大白菜

这篇文章主要为大家详细介绍了如何使用python进行雷电接口检测,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

功能概述

这个Python脚本用于检测系统的雷电(Thunderbolt)接口支持情况,包括:

检测系统是否有雷电控制器

检测Type-C/雷电端口

识别雷电接口版本(Thunderbolt 1-5)

显示理论传输速度

列出已连接的雷电设备

代码结构

1. 基础支持检测函数

def check_thunderbolt_support() -> Dict[str, bool]

这个函数通过Windows Management Instrumentation (WMI)命令检查系统的雷电支持情况,返回一个包含以下信息的字典:

has_controller: 是否存在雷电控制器

has_port: 是否有Type-C/雷电端口

is_active: 雷电接口是否处于激活状态

2. 版本检测函数

def get_thunderbolt_version() -> Dict[str, str]

识别系统支持的雷电版本,返回版本号和对应的理论速度:

3. 详细信息获取函数

def get_detailed_thunderbolt_info() -> List[Dict[str, str]]

获取所有已连接雷电设备的详细信息,包括:

4. 状态报告函数

def print_thunderbolt_status()

生成完整的雷电接口支持状态报告,包括:

使用方法

直接运行脚本:

python thunderbolt_check.py

作为模块导入:

from thunderbolt_check import check_thunderbolt_support, get_thunderbolt_version

# 检查基本支持
support_info = check_thunderbolt_support()

# 获取版本信息
version_info = get_thunderbolt_version()

注意事项

1.实际传输速度取决于:

主机支持的雷电版本

连接设备支持的雷电版本

实际会以两者中较低的速度运行

2.如果检测结果显示有雷电端口但未激活:

检查BIOS设置中的雷电支持选项

确保已安装最新的雷电驱动程序

3.版本速度对照表:

版本理论速度备注
Thunderbolt 580/120 Gbps预计2024年底推出
Thunderbolt 440 Gbps要求更严格的认证
Thunderbolt 340 Gbps最广泛使用的版本
Thunderbolt 220 Gbps较老的版本
Thunderbolt 110 Gbps最早的版本

技术实现细节

使用subprocess模块执行WMI命令

通过正则表达式解析设备信息

支持中英文设备描述识别

异常处理确保程序稳定运行

可能的错误和解决方案

“获取雷电版本信息时出错”

确保以管理员权限运行

检查WMI服务是否正常运行

“未检测到已连接的雷电设备”

确认设备是否正确连接

检查设备驱动是否正确安装

完整代码

import subprocess
import re
from typing import Dict, List, Tuple

def check_thunderbolt_support() -> Dict[str, bool]:
    """
    检查系统是否支持雷电接口
    
    Returns:
        Dict[str, bool]: 包含雷电接口支持信息的字典
        {
            'has_controller': bool,  # 是否有雷电控制器
            'has_port': bool,        # 是否有雷电端口
            'is_active': bool        # 雷电接口是否激活
        }
    """
    result = {
        'has_controller': False,
        'has_port': False,
        'is_active': False
    }
    
    try:
        # 检查 USB 控制器中的 Type-C 和雷电支持
        usb_controllers = subprocess.check_output(
            ["wmic", "path", "Win32_USBController", "get", "name,manufacturer"], 
            encoding='gbk'
        ).strip()
        
        if "Type-C" in usb_controllers:
            result['has_port'] = True
        
        # 检查设备管理器中的雷电设备
        tb_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where", 
             "caption like '%Thunderbolt%' OR caption like '%雷电%'", 
             "get", "caption,status"], 
            encoding='gbk'
        ).strip()
        
        if tb_devices and len(tb_devices.split('\n')) > 1:
            result['has_controller'] = True
            # 检查是否有正在工作的雷电设备
            if "OK" in tb_devices or "正常" in tb_devices:
                result['is_active'] = True
        
        # 额外检查 PCI 设备中的雷电控制器
        pci_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where", 
             "deviceid like '%PCI%'", "get", "caption"],
            encoding='gbk'
        ).strip()
        
        if any(x in pci_devices.lower() for x in ['thunderbolt', '雷电']):
            result['has_controller'] = True
            
    except Exception as e:
        print(f"检查雷电支持时出错: {e}")
    
    return result

def get_detailed_thunderbolt_info() -> List[Dict[str, str]]:
    """
    获取详细的雷电接口信息
    
    Returns:
        List[Dict[str, str]]: 包含所有雷电设备信息的列表
    """
    devices = []
    try:
        # 获取所有可能的雷电相关设备
        cmd_output = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where",
             "caption like '%Thunderbolt%' OR caption like '%雷电%' OR caption like '%Type-C%'",
             "get", "caption,manufacturer,status,deviceid"],
            encoding='gbk'
        ).strip()
        
        # 解析输出
        lines = cmd_output.split('\n')
        if len(lines) > 1:  # 跳过标题行
            headers = [h.strip().lower() for h in lines[0].split('  ') if h.strip()]
            for line in lines[1:]:
                if line.strip():
                    # 使用多个空格分割并过滤空字符串
                    values = [v.strip() for v in re.split(r'\s{2,}', line) if v.strip()]
                    if len(values) >= len(headers):
                        device = dict(zip(headers, values))
                        devices.append(device)
    
    except Exception as e:
        print(f"获取详细雷电信息时出错: {e}")
    
    return devices

def get_thunderbolt_version() -> Dict[str, str]:
    """
    获取雷电接口版本和速度信息
    
    Returns:
        Dict[str, str]: 包含雷电版本和速度信息的字典
    """
    version_info = {
        'version': 'Unknown',
        'speed': 'Unknown'
    }
    
    try:
        # 检查设备管理器中的雷电设备描述
        tb_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where",
             "caption like '%Thunderbolt%' or caption like '%雷电%'",
             "get", "caption,description"],
            encoding='gbk'
        ).strip()
        
        # 根据描述判断版本
        if 'Thunderbolt 5' in tb_devices or '雷电 5' in tb_devices:
            version_info['version'] = 'Thunderbolt 5'
            version_info['speed'] = '80 Gbps (双向), 最高120 Gbps (单向)'
        elif 'Thunderbolt 4' in tb_devices or '雷电 4' in tb_devices:
            version_info['version'] = 'Thunderbolt 4'
            version_info['speed'] = '40 Gbps'
        elif 'Thunderbolt 3' in tb_devices or '雷电 3' in tb_devices:
            version_info['version'] = 'Thunderbolt 3'
            version_info['speed'] = '40 Gbps'
        elif 'Thunderbolt 2' in tb_devices or '雷电 2' in tb_devices:
            version_info['version'] = 'Thunderbolt 2'
            version_info['speed'] = '20 Gbps'
        elif 'Thunderbolt' in tb_devices or '雷电' in tb_devices:
            version_info['version'] = 'Thunderbolt 1'
            version_info['speed'] = '10 Gbps'
            
    except Exception as e:
        print(f"获取雷电版本信息时出错: {e}")
    
    return version_info

def print_thunderbolt_status():
    """
    打印雷电接口支持状态报告
    """
    print("=" * 50)
    print("雷电接口支持状态检查报告")
    print("=" * 50)
    
    # 检查基本支持情况
    support_info = check_thunderbolt_support()
    print("\n主机雷电支持情况:")
    print(f"- 雷电控制器: {'✓ 已找到' if support_info['has_controller'] else '✗ 未找到'}")
    print(f"- Type-C/雷电端口: {'✓ 存在' if support_info['has_port'] else '✗ 不存在'}")
    print(f"- 雷电接口状态: {'✓ 已激活' if support_info['is_active'] else '✗ 未激活'}")
    
    # 获取并显示版本信息
    version_info = get_thunderbolt_version()
    print(f"\n主机雷电版本信息:")
    print(f"- 版本: {version_info['version']}")
    print(f"- 理论速度: {version_info['speed']}")
    
    # 获取详细信息
    detailed_info = get_detailed_thunderbolt_info()
    if detailed_info:
        print("\n已连接的雷电设备:")
        for idx, device in enumerate(detailed_info, 1):
            print(f"\n设备 {idx}:")
            if 'caption' in device:
                print(f"- 设备名称: {device['caption']}")
            if 'manufacturer' in device:
                print(f"- 制造商: {device['manufacturer']}")
            if 'status' in device:
                print(f"- 状态: {device['status']}")
    else:
        print("\n未检测到已连接的雷电设备")
    
    print("\n注意事项:")
    if not support_info['has_controller']:
        print("- 系统可能不支持雷电接口")
    if support_info['has_port'] and not support_info['is_active']:
        print("- 雷电接口存在但未激活,请检查BIOS设置")
    if support_info['has_controller'] and support_info['has_port']:
        print("- 系统支持雷电接口,如遇问题请更新驱动")
    print("- 实际传输速度取决于主机和设备支持的最低雷电版本")

if __name__ == "__main__":
    print_thunderbolt_status()

到此这篇关于使用python进行雷电接口检测的文章就介绍到这了,更多相关python雷电接口检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文