2013-05-05 6 views
2

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

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

С другой стороны, я нашел это, который работает In Python, how can I detect whether the computer is on battery power?, но, к сожалению, он не предоставляет никакой информации об Емкости.

Battery Information structure и Battery Status structure для этого идеально подходят. Теперь я знаю, что я должен использовать DeviceIoControl function, чтобы это сделать, и я нашел это C++ code, что объясняет это немного.

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

Заранее спасибо.

+0

Я предполагаю, что вы не хотите использовать 'win32api', потому что хотите использовать код на других платформах, поэтому я не уверен в альтернативных способах этого, потому что все системы имеют разные API. Если вам не нужны другие платформы, я могу помочь u – PurityLake

+0

У меня есть код, работающий для linux и mac os. Я пытаюсь получить что-то для окон сейчас, pywin32, win32api будет в порядке. Я изначально просто пытался избежать требования к внешней библиотеке. – cwoebker

ответ

7

Тим Голден отлично 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) 

Это, конечно, не кросс-платформенный, и он требует 3-й ресурс партии, но это действительно работает очень хорошо.

+0

Я уже пробовал это, и возникли две проблемы. Сначала класс [CIM_Battery] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa38718%28v=vs.85%29.aspx) не дает вам текущую емкость, насколько я знать. Это также, как правило, просто не дает мне большую часть данных (означает, что я получаю 0 или другие значения по умолчанию). Последняя часть выглядит интересной, хотя, я собираюсь попробовать ее и сообщить, если она сработает. – cwoebker

+0

Спасибо большое, что все мои проблемы решены. У меня осталась одна проблема, DesignCapacity всегда возвращает 0 для меня. Я пытался выполнять запросы и все, но даже те, которые просто дают мне ошибки. Я тестирую это на bootcamp с окнами 8, так что это может быть проблема, но я могу жить без DesignCapacity. Большое спасибо за вашу помощь. – cwoebker

2

Самый надежный способ получить эту информацию - используя 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" % (batt.percent, secs2hours(batt.secsleft))) 
charge = 93%, time left = 4:37:08 

Соответствующее обязательство является here.

+0

Много проблем в нем _ (Возможно, только для меня) _. –

 Смежные вопросы

  • Нет связанных вопросов^_^