Подтвердить что ты не робот

В Python, как я могу определить, находится ли компьютер на батарее?

Я играю с pygame, и одна вещь, которую я хотел бы сделать, - уменьшить количество кадров в секунду, когда компьютер работает от батареи (чтобы снизить потребление ЦП и увеличить время автономной работы).

Как я могу обнаружить на Python, находится ли компьютер в настоящее время от батареи?

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

4b9b3361

Ответ 1

Если вы хотите сделать это без 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

Ответ 2

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

EDIT: GetSystemPowerStatus() еще не реализован в win32api по состоянию на сборке 219 (2014-05-04).

Ответ 3

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

Ответ 4

Вы посмотрели sysinfo?

По googling я обнаружил, что возможно использовать sysinfo.

Ответ 5

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

    import power
    ans = power.PowerManagement().get_providing_power_source_type()
    if not ans:
        print "plugged into wall socket"
    else:
        print "on battery"

Ответ 6

Вы можете установить acpi. Из википедии

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

Затем используйте модуль subprocess в Python

import subprocess
cmd = 'acpi -b'

# for python 3.7+
p = subprocess.run(cmd.split(), shell=True, capture_output=True)
battery_info, error = p.stdout.decode(), p.stderr.decode()

# for python3.x (x<6)
battery_info = subprocess.check_output(cmd.split(), shell=True).decode('utf-8')

print (battery_info)