Получение емкости батареи Windows с помощью Python


Я ищу, чтобы выяснить как текущую емкость батареи, так и проектную емкость.

Пока что я могу работать с помощью классаWin32_Battery () , который не дает всей необходимой мне информации (по крайней мере, в моей системе). Для этого я использовал библиотеку wmi pure-python .

С другой стороны, я нашел это, которое работает в Python, как я могу определить, работает ли компьютер от батареи?, но, к сожалению, он не дает никаких информации о мощности тоже нет.

Информационная структура батареи иструктура состояния батареи кажутся идеальными для этого. Теперь я знаю, что мне нужно использовать функцию DeviceIoControl, чтобы сделать это, и я нашел этот C++ код, который немного объясняет это.

Я бы предпочел что-то, что просто использует ctypes, а не python win32api, предоставляемый pywin32. Если у вас есть идея, как это сделать в python, пожалуйста, позвольте мне знай!

Заранее благодарю.

2 3

2 ответа:

Превосходный модуль Тима Голдена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)
Это, конечно, не кросс-платформенный, и он требует стороннего ресурса, но он работает очень хорошо.

Самый надежный способ получить эту информацию-использовать 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

Соответствующий коммитздесь .