В Python, как я могу определить, работает ли компьютер от батареи? - PullRequest
17 голосов
/ 27 мая 2011

Я играю с Pygame, и я хотел бы уменьшить количество кадров в секунду, когда компьютер работает от батареи (чтобы снизить нагрузку на процессор и продлить время работы от батареи).

Как из Python определить, работает ли компьютер в данный момент от батареи?

Я использую Python 3.1 в Windows.

Ответы [ 4 ]

14 голосов
/ 27 мая 2011

Если вы хотите сделать это без win32api, вы можете использовать встроенный модуль ctypes. Обычно я запускаю CPython без win32api, поэтому мне нравятся эти решения.

Это немного больше работы для GetSystemPowerStatus(), потому что вы должны определить структуру SYSTEM_POWER_STATUS, но не плохо.

# Get power status of the system using ctypes to call GetSystemPowerStatus

import ctypes
from ctypes import wintypes

class SYSTEM_POWER_STATUS(ctypes.Structure):
    _fields_ = [
        ('ACLineStatus', wintypes.BYTE),
        ('BatteryFlag', wintypes.BYTE),
        ('BatteryLifePercent', wintypes.BYTE),
        ('Reserved1', wintypes.BYTE),
        ('BatteryLifeTime', wintypes.DWORD),
        ('BatteryFullLifeTime', wintypes.DWORD),
    ]

SYSTEM_POWER_STATUS_P = ctypes.POINTER(SYSTEM_POWER_STATUS)

GetSystemPowerStatus = ctypes.windll.kernel32.GetSystemPowerStatus
GetSystemPowerStatus.argtypes = [SYSTEM_POWER_STATUS_P]
GetSystemPowerStatus.restype = wintypes.BOOL

status = SYSTEM_POWER_STATUS()
if not GetSystemPowerStatus(ctypes.pointer(status)):
    raise ctypes.WinError()
print 'ACLineStatus', status.ACLineStatus
print 'BatteryFlag', status.BatteryFlag
print 'BatteryLifePercent', status.BatteryLifePercent
print 'BatteryLifeTime', status.BatteryLifeTime
print 'BatteryFullLifeTime', status.BatteryFullLifeTime

На моей системе, которая печатает это (в основном означает «рабочий стол, подключен»):

ACLineStatus 1
BatteryFlag -128
BatteryLifePercent -1
BatteryLifeTime 4294967295
BatteryFullLifeTime 4294967295
4 голосов
/ 27 мая 2011

Это просто, все, что вам нужно сделать, это вызвать функцию Windows API GetSystemPowerStatus из Python, возможно, импортировав модуль win32api.

РЕДАКТИРОВАТЬ: GetSystemPowerStatus() еще не реализовано в win32api от сборки 219 (2014-05-04).

1 голос
/ 01 февраля 2017

Самый надежный способ получить эту информацию в C - использовать GetSystemPowerStatus .Если батарея отсутствует, ACLineStatus будет установлено на 128. psutil предоставляет эту информацию в Linux, Windows и FreeBSD, поэтому для проверки наличия батареи вы можете сделать это

>>> import psutil
>>> has_battery = psutil.sensors_battery() is not None

Если батарея присутствует, и вы хотите узнать, есть ли питаниекабель подключен, вы можете сделать это:

>>> import psutil
>>> psutil.sensors_battery()
sbattery(percent=99, secsleft=20308, power_plugged=True)
>>> psutil.sensors_battery().power_plugged
True
>>> 
0 голосов
/ 24 июля 2017

Простой метод для индикации состояния питания кроссплатформенности - это модуль 'power', который вы можете установить с помощью pip

    import power
    ans = power.PowerManagement().get_providing_power_source_type()
    if not ans:
        print "plugged into wall socket"
    else:
        print "on battery"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...