使用Python获取Windows电池容量

cwo*_*ker 5 python windows battery ctypes pywin32

我想找出目前的电池容量和设计容量​​.

到目前为止,我可以使用Win32_Battery()类,它没有提供我需要的所有信息(至少在我的系统上没有).我使用了纯python wmi库.

另一方面,我发现这在Python中有效,如何检测计算机是否使用电池供电?但遗憾的是,它既没有提供任何有关容量的信息.

电池信息结构电池状态结构似乎为这个完美的.现在我知道我必须使用DeviceIoControl函数这样做,我发现这个C++代码解释了一下.

我更喜欢只使用ctypes的东西而不是pywin32提供的python win32api .如果你有想法如何在python中这样做,请告诉我!

提前致谢.

Gia*_*olà 9

检索此信息的最可靠方法是使用GetSystemPowerStatus而不是WMI.psutil在Linux,Windows和FreeBSD下公开这些信息:

>>> import psutil
>>>
>>> def secs2hours(secs):
...     mm, ss = divmod(secs, 60)
...     hh, mm = divmod(mm, 60)
...     return "%d:%02d:%02d" % (hh, mm, ss)
...
>>> battery = psutil.sensors_battery()
>>> battery
sbattery(percent=93, secsleft=16628, power_plugged=False)
>>> print("charge = %s%%, time left = %s" % (battery.percent, secs2hours(battery.secsleft)))
charge = 93%, time left = 4:37:08
Run Code Online (Sandbox Code Playgroud)

相关提交在这里.


Mik*_*ter 8

我相信Tim Golden的优秀wmi模块将为您提供您想要的一切.您只需要执行多个查询即可获得所有内容:

import wmi

c = wmi.WMI()
t = wmi.WMI(moniker = "//./root/wmi")

batts1 = c.CIM_Battery(Caption = 'Portable Battery')
for i, b in enumerate(batts1):
    print 'Battery %d Design Capacity: %d mWh' % (i, b.DesignCapacity or 0)


batts = t.ExecQuery('Select * from BatteryFullChargedCapacity')
for i, b in enumerate(batts):
    print ('Battery %d Fully Charged Capacity: %d mWh' % 
          (i, b.FullChargedCapacity))

batts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0')
for i, b in enumerate(batts):
    print '\nBattery %d ***************' % i
    print 'Tag:               ' + str(b.Tag)
    print 'Name:              ' + b.InstanceName

    print 'PowerOnline:       ' + str(b.PowerOnline)
    print 'Discharging:       ' + str(b.Discharging)
    print 'Charging:          ' + str(b.Charging)
    print 'Voltage:           ' + str(b.Voltage)
    print 'DischargeRate:     ' + str(b.DischargeRate)
    print 'ChargeRate:        ' + str(b.ChargeRate)
    print 'RemainingCapacity: ' + str(b.RemainingCapacity)
    print 'Active:            ' + str(b.Active)
    print 'Critical:          ' + str(b.Critical)
Run Code Online (Sandbox Code Playgroud)

这肯定不是跨平台的,它需要第三方资源,但它确实工作得很好.