- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发布了这个问题,询问如何在 Windows 10 上获取 CPU 和 GPU 温度:Get CPU and GPU Temp using Python Windows .对于那个问题,我没有包括没有管理员访问权限的限制(至少在我第一次发布答案时,以及在那之后的相当长一段时间内)。然后我修改了我的问题以使需要管理员访问权限的答案无效(这是唯一有效的答案)。一个模组回滚到我的问题的先前版本,并要求我发布一个新问题,所以我做到了。
我想知道是否有办法在 python 中获取 CPU 和 GPU 温度。我已经找到了一种适用于 Linux 的方法(使用 psutil.sensors_temperature
),我想找到一种适用于 Windows 的方法。
信息:
操作系统:Windows 10
Python:Python 3.8.3 64 位 (所以没有 32 位 DLL)
以下是我尝试过的一些东西:
当我尝试执行以下操作时,我得到 None (从这里 - https://stackoverflow.com/a/3264262/13710015 ):
import wmi
w = wmi.WMI()
prin(w.Win32_TemperatureProbe()[0].CurrentReading)
当我尝试执行以下操作时,我收到一个错误(从这里 -
https://stackoverflow.com/a/3264262/13710015 ):
import wmi
w = wmi.WMI(namespace="root\wmi")
temperature_info = w.MSAcpi_ThermalZoneTemperature()[0]
print(temperature_info.CurrentTemperature)
错误:
wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147217396, 'OLE error 0x8004100c', None, None)>
当我尝试执行以下操作时,我得到了(从这里 -
https://stackoverflow.com/a/58924992/13710015 ):
import ctypes
import ctypes.wintypes as wintypes
from ctypes import windll
LPDWORD = ctypes.POINTER(wintypes.DWORD)
LPOVERLAPPED = wintypes.LPVOID
LPSECURITY_ATTRIBUTES = wintypes.LPVOID
GENERIC_READ = 0x80000000
GENERIC_WRITE = 0x40000000
GENERIC_EXECUTE = 0x20000000
GENERIC_ALL = 0x10000000
FILE_SHARE_WRITE=0x00000004
ZERO=0x00000000
CREATE_NEW = 1
CREATE_ALWAYS = 2
OPEN_EXISTING = 3
OPEN_ALWAYS = 4
TRUNCATE_EXISTING = 5
FILE_ATTRIBUTE_NORMAL = 0x00000080
INVALID_HANDLE_VALUE = -1
FILE_DEVICE_UNKNOWN=0x00000022
METHOD_BUFFERED=0
FUNC=0x900
FILE_WRITE_ACCESS=0x002
NULL = 0
FALSE = wintypes.BOOL(0)
TRUE = wintypes.BOOL(1)
def CTL_CODE(DeviceType, Function, Method, Access): return (DeviceType << 16) | (Access << 14) | (Function <<2) | Method
def _CreateFile(filename, access, mode, creation, flags):
"""See: CreateFile function http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).asp """
CreateFile_Fn = windll.kernel32.CreateFileW
CreateFile_Fn.argtypes = [
wintypes.LPWSTR, # _In_ LPCTSTR lpFileName
wintypes.DWORD, # _In_ DWORD dwDesiredAccess
wintypes.DWORD, # _In_ DWORD dwShareMode
LPSECURITY_ATTRIBUTES, # _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes
wintypes.DWORD, # _In_ DWORD dwCreationDisposition
wintypes.DWORD, # _In_ DWORD dwFlagsAndAttributes
wintypes.HANDLE] # _In_opt_ HANDLE hTemplateFile
CreateFile_Fn.restype = wintypes.HANDLE
return wintypes.HANDLE(CreateFile_Fn(filename,
access,
mode,
NULL,
creation,
flags,
NULL))
handle=_CreateFile('\\\\\.\PhysicalDrive0',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)
def _DeviceIoControl(devhandle, ioctl, inbuf, inbufsiz, outbuf, outbufsiz):
"""See: DeviceIoControl function
http://msdn.microsoft.com/en-us/library/aa363216(v=vs.85).aspx
"""
DeviceIoControl_Fn = windll.kernel32.DeviceIoControl
DeviceIoControl_Fn.argtypes = [
wintypes.HANDLE, # _In_ HANDLE hDevice
wintypes.DWORD, # _In_ DWORD dwIoControlCode
wintypes.LPVOID, # _In_opt_ LPVOID lpInBuffer
wintypes.DWORD, # _In_ DWORD nInBufferSize
wintypes.LPVOID, # _Out_opt_ LPVOID lpOutBuffer
wintypes.DWORD, # _In_ DWORD nOutBufferSize
LPDWORD, # _Out_opt_ LPDWORD lpBytesReturned
LPOVERLAPPED] # _Inout_opt_ LPOVERLAPPED lpOverlapped
DeviceIoControl_Fn.restype = wintypes.BOOL
# allocate a DWORD, and take its reference
dwBytesReturned = wintypes.DWORD(0)
lpBytesReturned = ctypes.byref(dwBytesReturned)
status = DeviceIoControl_Fn(devhandle,
ioctl,
inbuf,
inbufsiz,
outbuf,
outbufsiz,
lpBytesReturned,
NULL)
return status, dwBytesReturned
class OUTPUT_temp(ctypes.Structure):
"""See: http://msdn.microsoft.com/en-us/library/aa363972(v=vs.85).aspx"""
_fields_ = [
('Board Temp', wintypes.DWORD),
('CPU Temp', wintypes.DWORD),
('Board Temp2', wintypes.DWORD),
('temp4', wintypes.DWORD),
('temp5', wintypes.DWORD)
]
class OUTPUT_volt(ctypes.Structure):
"""See: http://msdn.microsoft.com/en-us/library/aa363972(v=vs.85).aspx"""
_fields_ = [
('VCore', wintypes.DWORD),
('V(in2)', wintypes.DWORD),
('3.3V', wintypes.DWORD),
('5.0V', wintypes.DWORD),
('temp5', wintypes.DWORD)
]
def get_temperature():
FUNC=0x900
outDict={}
ioclt=CTL_CODE(FILE_DEVICE_UNKNOWN, FUNC, METHOD_BUFFERED, FILE_WRITE_ACCESS)
handle=_CreateFile('\\\\\.\PhysicalDrive0',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)
win_list = OUTPUT_temp()
p_win_list = ctypes.pointer(win_list)
SIZE=ctypes.sizeof(OUTPUT_temp)
status, output = _DeviceIoControl(handle, ioclt , NULL, ZERO, p_win_list, SIZE)
for field, typ in win_list._fields_:
#print ('%s=%d' % (field, getattr(disk_geometry, field)))
outDict[field]=getattr(win_list,field)
return outDict
def get_voltages():
FUNC=0x901
outDict={}
ioclt=CTL_CODE(FILE_DEVICE_UNKNOWN, FUNC, METHOD_BUFFERED, FILE_WRITE_ACCESS)
handle=_CreateFile('\\\\\.\PhysicalDrive0',GENERIC_WRITE,FILE_SHARE_WRITE,OPEN_EXISTING,ZERO)
win_list = OUTPUT_volt()
p_win_list = ctypes.pointer(win_list)
SIZE=ctypes.sizeof(OUTPUT_volt)
status, output = _DeviceIoControl(handle, ioclt , NULL, ZERO, p_win_list, SIZE)
for field, typ in win_list._fields_:
#print ('%s=%d' % (field, getattr(disk_geometry, field)))
outDict[field]=getattr(win_list,field)
return outDict
print(OUTPUT_temp._fields_)
输出:
[('Board Temp', <class 'ctypes.c_ulong'>), ('CPU Temp', <class 'ctypes.c_ulong'>), ('Board Temp2', <class 'ctypes.c_ulong'>), ('temp4', <class 'ctypes.c_ulong'>), ('temp5', <class 'ctypes.c_ulong'>)]
我试过这段代码,它工作,但它需要管理员(从这里 -
https://stackoverflow.com/a/62936850/13710015):
import clr # the pythonnet module.
clr.AddReference(r'YourdllPath')
from OpenHardwareMonitor.Hardware import Computer
c = Computer()
c.CPUEnabled = True # get the Info about CPU
c.GPUEnabled = True # get the Info about GPU
c.Open()
while True:
for a in range(0, len(c.Hardware[0].Sensors)):
# print(c.Hardware[0].Sensors[a].Identifier)
if "/intelcpu/0/temperature" in str(c.Hardware[0].Sensors[a].Identifier):
print(c.Hardware[0].Sensors[a].get_Value())
c.Hardware[0].Update()
我试过这段代码,但它也需要管理员(从这里 -
https://stackoverflow.com/a/49909330/13710015):
import clr #package pythonnet, not clr
openhardwaremonitor_hwtypes = ['Mainboard','SuperIO','CPU','RAM','GpuNvidia','GpuAti','TBalancer','Heatmaster','HDD']
cputhermometer_hwtypes = ['Mainboard','SuperIO','CPU','GpuNvidia','GpuAti','TBalancer','Heatmaster','HDD']
openhardwaremonitor_sensortypes = ['Voltage','Clock','Temperature','Load','Fan','Flow','Control','Level','Factor','Power','Data','SmallData']
cputhermometer_sensortypes = ['Voltage','Clock','Temperature','Load','Fan','Flow','Control','Level']
def initialize_openhardwaremonitor():
file = 'OpenHardwareMonitorLib.dll'
clr.AddReference(file)
from OpenHardwareMonitor import Hardware
handle = Hardware.Computer()
handle.MainboardEnabled = True
handle.CPUEnabled = True
handle.RAMEnabled = True
handle.GPUEnabled = True
handle.HDDEnabled = True
handle.Open()
return handle
def initialize_cputhermometer():
file = 'CPUThermometerLib.dll'
clr.AddReference(file)
from CPUThermometer import Hardware
handle = Hardware.Computer()
handle.CPUEnabled = True
handle.Open()
return handle
def fetch_stats(handle):
for i in handle.Hardware:
i.Update()
for sensor in i.Sensors:
parse_sensor(sensor)
for j in i.SubHardware:
j.Update()
for subsensor in j.Sensors:
parse_sensor(subsensor)
def parse_sensor(sensor):
if sensor.Value is not None:
if type(sensor).__module__ == 'CPUThermometer.Hardware':
sensortypes = cputhermometer_sensortypes
hardwaretypes = cputhermometer_hwtypes
elif type(sensor).__module__ == 'OpenHardwareMonitor.Hardware':
sensortypes = openhardwaremonitor_sensortypes
hardwaretypes = openhardwaremonitor_hwtypes
else:
return
if sensor.SensorType == sensortypes.index('Temperature'):
print(u"%s %s Temperature Sensor #%i %s - %s\u00B0C" % (hardwaretypes[sensor.Hardware.HardwareType], sensor.Hardware.Name, sensor.Index, sensor.Name, sensor.Value))
if __name__ == "__main__":
print("OpenHardwareMonitor:")
HardwareHandle = initialize_openhardwaremonitor()
fetch_stats(HardwareHandle)
print("\nCPUMonitor:")
CPUHandle = initialize_cputhermometer()
fetch_stats(CPUHandle)
我也可以在 Python、可移植命令行应用程序(将使用
subprocess.Popen
运行)、DLL 和命令(将使用
subprocess.Popen
运行)中使用 C/C++ 扩展。
最佳答案
问题
非特权用户需要以安全的方式访问只有特权用户才能使用的功能。
解决方案
创建一个服务器-客户端接口(interface),其中功能与实际系统分离,以防止安全问题(即:不要直接从客户端通过管道传输命令或选项以供服务器执行)。
考虑将 gRPC 用于此服务器-客户端接口(interface)。如果您以前没有使用过 gRPC,这里有一个例子来说明它的含义:
创建 temperature.proto
:
syntax = "proto3";
option java_multiple_files = true;
option java_package = "temperature";
option java_outer_classname = "TemperatureProto";
option objc_class_prefix = "TEMP";
package temperature;
service SystemTemperature {
rpc GetTemperature (TemperatureRequest) returns (TemperatureReply) {}
}
message TemperatureRequest {
string name = 1;
}
message TemperatureReply {
string message = 1;
}
用
protoc
编译上述内容来自
protobuf
图书馆。
python -m grpc_tools.protoc --proto_path=. temperature.proto --python_out=. --grpc_python_out=.
这将生成一个名为
temperature_pb2_grpc.py
的文件,您将在其中定义 GetTemperature 的功能和响应,请注意,您可以根据从客户端传递的 TemperatureRequest 选项实现逻辑分支。
temperature_server.py
来自您的特权用户和
temperature_client.py
来自您的非特权用户。
关于python - 在没有管理员访问权限的情况下使用 Python 获取 CPU 和 GPU 温度 - Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64996339/
谁能告诉我下面的代码是如何工作的, #define func(t, a, b){ t temp; temp=a; a=b; b=temp;} int main() { int a=3, b=4; f
private static final Group[] toGroups (String string) { int partialGroupSize = strin
我想更改 svg 的此文本部分: **--** 我想显示来自 KNX 安装的温度我已尝试使用以下代码,但没有任何反应: 以 $('#VL_temp' 开头的行有什么问题?其余代码似乎没问题,
目标 测量我的 Linux Box 的 CPU 温度。 到目前为止工作已完成 我已经安装了 lm-sensors 来检测温度,下面是命令传感器的输出: root@XXXX-XX :# sensors
我知道以某种方式获取 CPU 的温度是可能的,因为我下载了一个应用程序,它可以在没有开启Root的设备上执行此操作。它是怎么做到的? 编辑:该应用程序称为 A1 CPU 工具。我花了几天时间寻找答案。
我对如何使用一些视频卡驱动程序 API 读取 GPU 温度(图形处理单元,显卡主芯片)的方法感兴趣? 每个人都知道有两个不同的芯片制造商(至少是流行的)- ATI 和 nVIDIA - 因此有两种不同
我有一个运行 Windows 10 IoT 核心版的 Raspberry Pi 3。我的问题是;是否有可能,或者是否有一种方法可以通过远程 PowerShell 连接、在设备本地的命令行控制台中监控设
这里我真的很疑惑。我想创建一个应用程序,它在我的显卡(AMD 显卡)的不同温度下执行不同的事件。 我想制作这样一个应用程序的原因是,对于 GPU,我还没有找到一个,其次是为了确保我永远不会因为达到巨大
我想获取 CPU 温度。下面是我使用 C++ 和 WMI 所做的。我正在阅读 MSAcpi_ThermalZoneTemperature,但它总是一样的,根本不是 CPU 温度。 有没有什么办法不用写
我正在尝试使用 Raspberry Pi 上的 DS18B20 传感器读取温度。我的问题是从这个传感器读取数据需要时间。它不多,或多或少 1 秒,但我不能让我的主程序等到这完成。我不需要有“最近的值(
我正在为系统性能创建一个个人监控程序,但我在弄清楚 C# 如何检索 CPU 和 GPU 温度信息时遇到了问题。 我已经让程序通过 PerformanceCounter 检索 CPU 负载和频率信息(以
我需要使用 Swift 获取 CPU 温度,但除了 this 之外我找不到任何信息. 我认为我应该使用 IOKit.framework 但同样没有太多关于它的信息。 最佳答案 使用 https://g
我只是想知道。在 PHP 中设置一个没有过期的 cookie(意味着它在浏览器关闭时过期)和设置一个 session 变量之间有什么区别。我不是在谈论登录之类的东西;而不是需要在每次访问页面时获取不太
本文实例讲述了android电源信息查看方法。分享给大家供大家参考。具体如下: 1. PowerTestActivity: ?
我有一个通过 http 连接的温度传感器,我想每 5 秒向 Amcharts 添加一次温度。有人有一些如何向当前数据集添加新值的示例吗?我将使用折线图来表示 y 轴上的温度和 x 轴上的日期时间 谢谢
大家好,我正在尝试通过 php.wsdl Web 服务发送我的温度和湿度传感器,我需要将数据解析到 Web 服务,以便我可以将其从 Web 服务插入 mysql 数据库.. 我遇到了一些问题,请指教
如何从 Linux 上的 bash 获取平均 CPU 温度?最好是华氏度。该脚本应该能够处理不同数量的 CPU。 最佳答案 你这样做: 安装 sudo apt install lm-sensors s
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: Getting CPU temperature using Python? 最简单的方法是什么?也最好是摄氏
如何在 Linux 上获取 CPU 的当前温度? 有several questions and answers关于使用 C# 获取 CPU 温度,但它们似乎都是特定于 Windows 的。 最佳答案
我正在使用此代码获取当前 CPU 温度: 并看到了it也是 private float getCurrentCPUTemperature() { String file = readFile
我是一名优秀的程序员,十分优秀!