【问题标题】:Getting CPU information from Python WMI从 Python WMI 获取 CPU 信息
【发布时间】:2014-07-24 13:02:25
【问题描述】:

我正在尝试从 Pythons WMI 模块获取一些系统信息,但是网上提到的所有方法似乎都不起作用。我知道用其他语言更容易做到这一点,但出于某种原因,我想尝试在 Python 中做到这一点。

我尝试过使用Win32_TemperatureProbe() 方法,但我得到了None 的返回值。我也试过MSAcpi_ThermalZoneTemperature(),错误如下。我一直在做我的研究,似乎找不到任何替代方法或修复这些错误。似乎有很多线程打开但没有解决。

这是我当前的代码:

import wmi, platform

#Initiating WMI
c = wmi.WMI(namespace="root\\wmi")

#Setting variables
drive_letter, free_space = [], []
stats = {}

#Getting basic infromation
print(platform.processor())
print(c.MSAcpi_ThermalZoneTemperature()[0].CurrentTemperature/10.0)-273.15

for disk in c.Win32_LogicalDisk(["Caption","FreeSpace"], DriveType=3):
   free_space_GB = round(int((disk.FreeSpace))/1073741824, 2)
   drive_letter.append(str(disk.Caption))
   free_space.append(str(free_space_GB))

stats = {"Free Space":free_space, "Drive Letter":drive_letter}

print(stats)

这是我运行此代码时得到的输出:

Intel64 Family 6 Model 60 Stepping 3, GenuineIntel
Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\wmi.py", line 817, in query
    return self._namespace.query (wql, self, fields)
  File "C:\Python34\lib\site-packages\wmi.py", line 1009, in query
    return [ _wmi_object (obj, instance_of, fields) for obj in self._raw_query(wql) ]
  File "C:\Python34\lib\site-packages\wmi.py", line 1009, in <listcomp>
    return [ _wmi_object (obj, instance_of, fields) for obj in self._raw_query(wql) ]
  File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 247, in __getitem__
    return self._get_good_object_(self._enum_.__getitem__(index))
  File "C:\Python34\lib\site-packages\win32com\client\util.py", line 37, in __getitem__
    return self.__GetIndex(index)
  File "C:\Python34\lib\site-packages\win32com\client\util.py", line 53, in __GetIndex
    result = self._oleobj_.Next(1)
pywintypes.com_error: (-2147217396, 'OLE error 0x8004100c', None, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Brandyn\Desktop\Performance_monitor.py", line 12, in <module>
    print(c.MSAcpi_ThermalZoneTemperature()[0].CurrentTemperature/10.0)-273.15
  File "C:\Python34\lib\site-packages\wmi.py", line 819, in query
    handle_com_error ()
  File "C:\Python34\lib\site-packages\wmi.py", line 241, in handle_com_error
    raise klass (com_error=err)
wmi.x_wmi: <x_wmi: Unexpected COM Error (-2147217396, 'OLE error 0x8004100c', None, None)>

当我将命名空间更改为 null 时,错误变为:

Intel64 Family 6 Model 60 Stepping 3, GenuineIntel
Traceback (most recent call last):
  File "C:\Python34\lib\site-packages\wmi.py", line 1145, in __getattr__
    return self._cached_classes (attribute)
  File "C:\Python34\lib\site-packages\wmi.py", line 1156, in _cached_classes
    self._classes_map[class_name] = _wmi_class (self, self._namespace.Get (class_name))
  File "<COMObject winmgmts:>", line 3, in Get
  File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 282, in _ApplyTypes_
    result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'SWbemServicesEx', 'Not found ', None, 0, -2147217406), None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Brandyn\Desktop\Performance_monitor.py", line 12, in <module>
    print(c.MSAcpi_ThermalZoneTemperature()[0].CurrentTemperature/10.0)-273.15
  File "C:\Python34\lib\site-packages\wmi.py", line 1147, in __getattr__
    return getattr (self._namespace, attribute)
  File "C:\Python34\lib\site-packages\win32com\client\dynamic.py", line 522, in __getattr__
    raise AttributeError("%s.%s" % (self._username_, attr))
AttributeError: winmgmts:.MSAcpi_ThermalZoneTemperature

此方法是否有解决方案,或者是否有其他可行的替代方法,或者我应该停止此方法并专注于不同的语言?

【问题讨论】:

  • 我遇到了同样的问题,你能找到解决问题的方法吗?或任何在 Windows 上查找 CPU 温度的解决方案?

标签: python wmi


【解决方案1】:

我有同样的问题。

对于Win32_LogicalDisk,您需要将命名空间root\\wmi 替换为root\\cimv2。 然后它在 Win7 上对我有用。

对于MSAcpi_ThermalZoneTemperature,我还没有找到解决方案。对象如下所示

    >>> print c.MSAcpi_ThermalZoneTemperature
[dynamic: ToInstance, provider("WMIProv"), WMI, guid("{A1BC18C0-A7C8-11d1-BF3C-00A0C9062910}")]
class MSAcpi_ThermalZoneTemperature : MSAcpi
{
    [key, read] string InstanceName;
    [read] boolean Active;
    [WmiDataId(1), read] uint32 ThermalStamp;
    [WmiDataId(2), read] uint32 ThermalConstant1;
    [WmiDataId(3), read] uint32 ThermalConstant2;
    [WmiDataId(4), read] uint32 Reserved;
    [WmiDataId(5), read] uint32 SamplingPeriod;
    [WmiDataId(6), read] uint32 CurrentTemperature;
    [WmiDataId(7), read] uint32 PassiveTripPoint;
    [WmiDataId(8), read] uint32 CriticalTripPoint;
    [WmiDataId(9), read] uint32 ActiveTripPointCount;
    [WmiDataId(10), MissingValue(0), read, MAX(10)] uint32 ActiveTripPoint[];
};

但是c.MSAcpi_ThermalZoneTemperature.CurrentTemperature 返回None

有趣的是如果我们运行以下代码

import win32com.client
strComputer = "."
objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
objSWbemServices = objWMIService.ConnectServer(strComputer,"root\WMI")
colItems = objSWbemServices.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature")
print repr(colItems)
print len(colItems)

然后调用print repr(colItems) 返回&lt;COMObject &lt;unknown&gt;&gt; 并调用print len(colItems) 会产生异常:

Traceback (most recent call last):
  File "get_wmi_test1.py", line 45, in <module>
    print len(colItems)
  File "C:\Python27\lib\site-packages\win32com\client\dynamic.py", line 228, in
__len__
    return self._oleobj_.Invoke(dispid, LCID, invkind, 1)
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'SWbemObjectSet'
, u'Not supported ', None, 0, -2147217396), None)

我环顾四周,似乎是更复杂的问题。看这里:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 2011-03-31
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多