python 调用 C# dll 库读取电脑硬件信息

一、核心需求

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

二、实现思路

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

三、核心代码

import clr #package pythonnet, not clr
from datamap import data

class HardWareReader():
    def __init__(self,path_dll:str,conf:dict) -> None:
        self.dll = path_dll
        self.conf = conf
        self.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 Hardware
        handle = 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 handle

    def 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_ls
    
    def parse_sensor(self,sensor):

        if sensor.Value is not None:
            sensortypes = self.sensortypes
            hardwaretypes = self.hwtypes
        else:
            return None
        if 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 None

if __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 yaml

class 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:
   true
  GPUEnabled:
   true
  RAMEnabled:
   true
  HDDEnabled:
   true
  MainboardEnabled:
   true
  FanControllerEnabled:
   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 typeNameDescriptionExample
stringNameTypically a combination of make and modelIntel Core 2 Duo E8400
stringIdentifierA unique identifier for this piece of hardware/intelcpu/0
stringHardwareType下边定义的硬件类型(HardwareType)CPU
stringParentThe 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 TypeUnit usedRecommended display format
VoltageVolt(电压)«value» V
ClockMegahertz«value» MHz
TemperatureCelsius(摄氏度)«value» °C
LoadPercentage(百分比)«value»%
FanRevolutions per minute(转每分)«value» RPM
FlowLiters per hour«value» L/h
ControlPercentage(百分比)«value»%
LevelPercentage(百分比)«value»%
   public enum SensorType {
     Voltage, // V
     Clock, // MHz
     Temperature, // °C
     Load, // %
     Fan, // RPM
     Flow, // L/h
     Control, // %
     Level, // %
     Factor, // 1
     Power, // W
     Data, // GB = 2^30 Bytes    
     SmallData, // MB = 2^20 Bytes
     Throughput, // MB/s = 2^20 Bytes/s
   }

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

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

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

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

参考

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

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Python 调用 C# dll 最简方法有以下两种: 1.使用PythonnetPythonnet是一个能够把 Python 和 .NET 程序集融合在一起的,可以很方便地调用 C# dll 。首先需要安装Pythonnet,在Python中导入clr模块,然后使用clr.AddReference添加dll的引用,最后就可以使用C# dll中的类和函数了。 示例代码: ```python import clr clr.AddReference("test.dll") # 添加dll引用 from test import Test # 导入C#类Test if __name__ == '__main__': t = Test() print(t.HelloWorld()) # 调用C#类Test中的HelloWorld方法 ``` 2.使用ctypes:ctypes是Python的标准之一,也可以用来调用C# dll。可以使用LoadLibrary函数加载dll,然后使用dll中的函数和类。 示例代码: ```python import ctypes # 加载dll test_dll = ctypes.WinDLL("test.dll") # 定义C#类Test中的HelloWorld函数 test_dll.Test_HelloWorld.restype = ctypes.c_char_p test_dll.Test_HelloWorld.argtypes = [] if __name__ == '__main__': print(test_dll.Test_HelloWorld().decode()) # 调用C# dll中的函数Test_HelloWorld ``` 需要注意的是,使用ctypes调用C# dll需要在C#中使用__declspec(dllexport)标记暴露函数和类,例如: ```csharp using System; using System.Runtime.InteropServices; namespace Test { public class Test { [DllImport("test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr Test_HelloWorld(); public string HelloWorld() { return Marshal.PtrToStringUni(Test_HelloWorld()); } } } ``` 以上就是Python 调用 C# dll 最简方法的详细介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YumOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值