一、核心需求

python程序读取电脑硬件信息,包括主板CPU内存GPU风扇硬盘

二、实现思路

使用pythonnet调用Open Hardware MonitorLib.dll,通过该dll提供的接口读取硬件信息

  • pythonnet:使用该库调用C#的dll
  • OpenHardwareMonitorLib.dll:OpenHardwareMonitor开源项目是用来监测硬件信息的,巨硬出品,该项目里有两个项目,将OpenHardwareMonitorLib编译为dll,后续方便python调用

三、核心代码

import clr #package pythonnet, not clr
from datamap import dataclass HardWareReader():def __init__(self,path_dll:str,conf:dict) -> None:self.dll = path_dllself.conf = confself.hwtypes = ['Mainboard','SuperIO','CPU','RAM','GpuNvidia','GpuAti','TBalancer','Heatmaster','HDD']self.sensortypes = ['Voltage','Clock','Temperature','Load','Fan','Flow','Control','Level','Factor','Power','Data','SmallData','Throughput']def init(self):clr.AddReference(self.dll)from OpenHardwareMonitor import Hardwarehandle = Hardware.Computer()handle.MainboardEnabled = self.conf['MainboardEnabled']handle.CPUEnabled = self.conf['CPUEnabled']handle.RAMEnabled = self.conf['RAMEnabled']handle.GPUEnabled = self.conf['GPUEnabled']handle.HDDEnabled = self.conf['HDDEnabled']handle.Open()return handledef fetch_stats(self,handle):hardware_ls = []for i in handle.Hardware:i.Update()for sensor in i.Sensors:res = self.parse_sensor(sensor)hardware_ls.append(res)for j in i.SubHardware:j.Update()for subsensor in j.Sensors:res = self.parse_sensor(subsensor)hardware_ls.append(res)return hardware_lsdef parse_sensor(self,sensor):if sensor.Value is not None:sensortypes = self.sensortypeshardwaretypes = self.hwtypeselse:return Noneif sensor.SensorType == sensortypes.index('Temperature'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)  elif sensor.SensorType == sensortypes.index('Voltage'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Clock'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Load'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Fan'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Flow'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Control'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Level'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Factor'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Power'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Data'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('SmallData'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)elif sensor.SensorType == sensortypes.index('Throughput'):return u"hardwareType:{},hardwareName:{},sensorIndex:{},senserName:{} sensorValue{:.2f}".format(hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value)else:return Noneif __name__ == "__main__":print("OpenHardwareMonitor:")# 伪代码,按需修改# HardwareHandle = init(OpenHardwareMonitor.dll路径,conf配置文件,字典格式)# fetch_stats(HardwareHandle)# input('关闭窗口')# 以下是我的系统的输出:# OpenHardwareMonitor:# SuperIO Nuvoton NCT6791D Temperature Sensor #0 CPU Core - 42.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #1 Temperature #1 - 35.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #2 Temperature #2 - 34.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #3 Temperature #3 - 25.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #4 Temperature #4 - 101.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #5 Temperature #5 - 16.0°C# SuperIO Nuvoton NCT6791D Temperature Sensor #6 Temperature #6 - 14.0°C# GpuNvidia NVIDIA GeForce GTX 1070 Temperature Sensor #0 GPU Core - 60.0°C# HDD ST31000528AS Temperature Sensor #0 Temperature - 37.0°C# HDD WDC WD20EARX-00PASB0 Temperature Sensor #0 Temperature - 36.0°C# HDD WDC WDS100T2B0B-00YS70 Temperature Sensor #0 Temperature - 40.0°C# HDD WDC WD80EFZX-68UW8N0 Temperature Sensor #0 Temperature - 31.0°C# HDD WDC WD30EFRX-68EUZN0 Temperature Sensor #0 Temperature - 30.0°C# HDD WDC WD80EFZX-68UW8N0 Temperature Sensor #0 Temperature - 33.0°C# HDD Crucial_CT256MX100SSD1 Temperature Sensor #0 Temperature - 40.0°C
# datamap.py
def data():data = {'CPU':{'Clocks':{},'Temperatures':{},'Load':{},'Powers':{}},'GPU':{'Voltages':{},'Clocks':{},'Temperatures':{},'Load':{},'Fans':{},'Controls':{},'Powers':{}},'IO':{'Voltages':{},'Temperatures':{},'Fans':{},'Controls':{}},'HDD':{'one':{'Temperatures':{},'Load':{}},'two':{}},'RAM':{'Load':{},'Data':{}}}return data
# conf.py
# coding:utf-8
import yamlclass Yaml():def yamlRead(self,yaml_path:str): f = open(yaml_path, 'r', encoding='utf-8')cfg = f.read()d = yaml.load(cfg,Loader=yaml.FullLoader)  # 用load方法转字典return d
# conf.yaml
SERVER:host:'127.0.0.1'port:8266
HARDWARE:CPUEnabled:trueGPUEnabled:trueRAMEnabled:trueHDDEnabled:trueMainboardEnabled:trueFanControllerEnabled:true
SIGN: 'wdx845o'

四、Open Hardware Monitor

1、读取过程

  1. 先设置要检测的项目:​MainboardEnabledCPUEnabledRAMEnabledGPUEnabledFanControllerEnabledHDDEnabled

     my_computer = Computer() #实例这这个类my_computer.CPUEnabled = True #监测CPU,其他同理
    
  2. 读取Hardware的参数

     # 这个顺序按下边的枚举的顺序my_computer.Hardware[0].Identifier # 0表示 CPU
    
  3. 读取Sensors的参数

     # 这个顺序按下边的枚举的顺序my_computer.Hardware[0].Sensors[0].Identifier
    

2、OpenHardwareMonitorLib中重要概念

一共三层概念,从高到低层次依次是:Computer>HardWare > Sensors >

2.1、Hardware

Value type Name Description Example
string Name Typically a combination of make and model Intel Core 2 Duo E8400
string Identifier A unique identifier for this piece of hardware /intelcpu/0
string HardwareType 下边定义的硬件类型(HardwareType) CPU
string Parent The identifier of its parent Hardware; if any. “/mainboard” or “”
 public enum HardwareType{Mainboard = 0,SuperIO = 1,CPU = 2,GpuNvidia = 3,GpuAti = 4,TBalancer = 5,Heatmaster = 6,HDD = 7,}

2.2、SenorType

Sensor Type Unit used Recommended display format
Voltage Volt(电压) «value» V
Clock Megahertz «value» MHz
Temperature Celsius(摄氏度) «value» °C
Load Percentage(百分比) «value»%
Fan Revolutions per minute(转每分) «value» RPM
Flow Liters per hour «value» L/h
Control Percentage(百分比) «value»%
Level Percentage(百分比) «value»%
   public enum SensorType {Voltage, // VClock, // MHzTemperature, // °CLoad, // %Fan, // RPMFlow, // L/hControl, // %Level, // %Factor, // 1Power, // WData, // GB = 2^30 Bytes    SmallData, // MB = 2^20 BytesThroughput, // MB/s = 2^20 Bytes/s}

负载、控制和级别类型的每种类型都使用百分比作为其单位,但有明显不同的用途。

  • Load(负载):表示一块硬件上的负载,其中100%表示一个完全加载的组件。

  • Control(控制): 通常与风扇控制器一起使用,用于表示占空比。

  • Level(级别):这是一个通用的基于%的级别度量,当上述两者都不适用时使用

参考

orcode上 一篇《在python中访问CPU温度》的问答,但是原地址我找不到了

python 调用 C# dll 库读取电脑硬件信息相关推荐

  1. python获取电脑硬件信息_Python实现的读取电脑硬件信息功能示例

    本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...

  2. 学python电脑硬件_Python实现的读取电脑硬件信息功能示例

    本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...

  3. python运行时关闭硬件信息-Python实现的读取电脑硬件信息功能示例

    本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...

  4. python软件电脑配置要求-Python实现的读取电脑硬件信息功能示例

    本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...

  5. python软件下载对电脑配置要求-Python实现的读取电脑硬件信息功能示例

    本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...

  6. Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。

    Python调用C++ DLL库 解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题. 一.问题:   在进行Python开发的过程中,很可能遇到调用C++ ...

  7. C# 读取电脑硬件信息

    我们有时遇到安装软件需要授权文件,就是利用电脑的硬件信息,来创建的授权文件的.加密和解密是很复杂的,可以独立一篇文章介绍一下,本文具体介绍C#获取电脑硬件信息,例如CPU信息,硬盘信息,RAM信息,主 ...

  8. python调用c#dll_详解Python 调用C# dll库最简方法

    1.为什么要跨平台编程?双平台编程或多平台编程,只是为提供更好开发更兼容的解决方案的一种手段,编程时服务于产品和客户的,也是因地制宜. 先安装python所需的库clr ,我这里已经安装了,可以去对应 ...

  9. python调用.net动态库

    # python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...

最新文章

  1. 上周热点回顾(7.1-7.7)
  2. cygwin中安装软件
  3. VHD(Virtual Hard Disk)的解析(上篇)——PyVinil的使用
  4. python循环输出00-59
  5. Flutter监听音量实现波形可视化的音频
  6. 经典项目|手撸一个高质量RPC框架
  7. keras中的回调函数
  8. 阿里云MaxCompute,用计算力让数据发声
  9. DirectX 3D 设备丢失(lost device)的处理
  10. 如何向普通人解释机器学习、数据挖掘
  11. Hdu1412 (set......Java)
  12. JavaScript之验证码--常用js特效
  13. java 新手入门级项目(家庭收支记账软件)
  14. 网易云音乐歌单监控 IOS捷径
  15. 开源漫画翻译神器! AI 自动清除、填补漫画文字!
  16. Elasticsearch-查询性能调优
  17. TCP可以从我们的视听感知中借鉴些什么
  18. UDS 0x22服务 DID增加流程
  19. 使用Python实现微信发送文本消息、图片以及附件
  20. 年终奖买啥最合适?马上安排降噪耳机界的扛把子,索尼WF-1000XM4

热门文章

  1. IDEA java出现无效的源发行版14解决方案
  2. FLIR E85/E95/T620/t610/T540/T530红外热像仪全齐
  3. se(3)-TrackNet: Data-driven 6D Pose Tracking by Calibrating Image Residuals in Synthetic Domains
  4. ”操作必须使用一个可更新的查询“的解决
  5. Word97文字处理软件培训教案
  6. 在IE下-下载文件-文件名中文名乱码问题
  7. (超详细)JAVA SE开发工具包(JDK)在Windows系统中的下载、安装和配置的方法
  8. hifi android 手机吗,手机真能玩HiFi吗?手机玩HiFi必备的APP
  9. 服装设计要学计算机吗,学服装设计用什么电脑_服装设计师要做什么
  10. 【计算机网络中 冲突域、广播域】