python 调用 C# dll 库读取电脑硬件信息
一、核心需求
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、读取过程
先设置要检测的项目:
MainboardEnabled
,CPUEnabled
,RAMEnabled
,GPUEnabled
,FanControllerEnabled
,HDDEnabled
my_computer = Computer() #实例这这个类my_computer.CPUEnabled = True #监测CPU,其他同理
读取Hardware的参数
# 这个顺序按下边的枚举的顺序my_computer.Hardware[0].Identifier # 0表示 CPU
读取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 库读取电脑硬件信息相关推荐
- python获取电脑硬件信息_Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- 学python电脑硬件_Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- python运行时关闭硬件信息-Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- python软件电脑配置要求-Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- python软件下载对电脑配置要求-Python实现的读取电脑硬件信息功能示例
本文实例讲述了Python实现的读取电脑硬件信息功能.分享给大家供大家参考,具体如下: 上学那会,老师让我用java获取电脑硬件信息,CPU, 硬盘,MAC等,那个时候感觉搞了好久...... 今天, ...
- Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。
Python调用C++ DLL库 解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题. 一.问题: 在进行Python开发的过程中,很可能遇到调用C++ ...
- C# 读取电脑硬件信息
我们有时遇到安装软件需要授权文件,就是利用电脑的硬件信息,来创建的授权文件的.加密和解密是很复杂的,可以独立一篇文章介绍一下,本文具体介绍C#获取电脑硬件信息,例如CPU信息,硬盘信息,RAM信息,主 ...
- python调用c#dll_详解Python 调用C# dll库最简方法
1.为什么要跨平台编程?双平台编程或多平台编程,只是为提供更好开发更兼容的解决方案的一种手段,编程时服务于产品和客户的,也是因地制宜. 先安装python所需的库clr ,我这里已经安装了,可以去对应 ...
- python调用.net动态库
# python调用.net动态库 ### pythonnet简介 ----------------------------- - pythonnet是cpython的扩展 - pythonnet提供 ...
最新文章
- 上周热点回顾(7.1-7.7)
- cygwin中安装软件
- VHD(Virtual Hard Disk)的解析(上篇)——PyVinil的使用
- python循环输出00-59
- Flutter监听音量实现波形可视化的音频
- 经典项目|手撸一个高质量RPC框架
- keras中的回调函数
- 阿里云MaxCompute,用计算力让数据发声
- DirectX 3D 设备丢失(lost device)的处理
- 如何向普通人解释机器学习、数据挖掘
- Hdu1412 (set......Java)
- JavaScript之验证码--常用js特效
- java 新手入门级项目(家庭收支记账软件)
- 网易云音乐歌单监控 IOS捷径
- 开源漫画翻译神器! AI 自动清除、填补漫画文字!
- Elasticsearch-查询性能调优
- TCP可以从我们的视听感知中借鉴些什么
- UDS 0x22服务 DID增加流程
- 使用Python实现微信发送文本消息、图片以及附件
- 年终奖买啥最合适?马上安排降噪耳机界的扛把子,索尼WF-1000XM4
热门文章
- IDEA java出现无效的源发行版14解决方案
- FLIR E85/E95/T620/t610/T540/T530红外热像仪全齐
- se(3)-TrackNet: Data-driven 6D Pose Tracking by Calibrating Image Residuals in Synthetic Domains
- ”操作必须使用一个可更新的查询“的解决
- Word97文字处理软件培训教案
- 在IE下-下载文件-文件名中文名乱码问题
- (超详细)JAVA SE开发工具包(JDK)在Windows系统中的下载、安装和配置的方法
- hifi android 手机吗,手机真能玩HiFi吗?手机玩HiFi必备的APP
- 服装设计要学计算机吗,学服装设计用什么电脑_服装设计师要做什么
- 【计算机网络中 冲突域、广播域】