在Python中,如何检测计算机是否使用电池供电?

时间:2011-05-27 14:43:26

标签: python windows pygame

我正在玩pygame,我想做的一件事就是减少计算机电池供电时的每秒帧数(降低CPU使用率并延长电池续航时间)。

如何从Python中检测到计算机当前是否使用电池供电?

我在Windows上使用Python 3.1。

5 个答案:

答案 0 :(得分:14)

如果您想在没有win32api的情况下执行此操作,则可以使用内置的ctypes模块。我通常在没有win32api的情况下运行CPython,所以我有点像这些解决方案。

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

答案 1 :(得分:4)

这很容易,你要做的就是从Python调用Windows API函数GetSystemPowerStatus,可能是通过导入win32api模块。

自编译219(2014-05-04)起,GetSystemPowerStatus()尚未实施

编辑 win32api

答案 2 :(得分:1)

在C中检索此信息的最可靠方法是使用GetSystemPowerStatus。如果没有电池,ACLineStatus将设置为128psutil在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
>>> 

答案 3 :(得分:0)

跨平台电源状态指示的一种简单方法是“电源”模块,您可以使用pip

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

答案 4 :(得分:0)

您可以安装acpi。来自维基百科

  

在计算机中,高级配置和电源接口提供了一个开放标准,操作系统可使用该标准来发现和配置计算机硬件组件,通过使未使用的组件进入睡眠状态来执行电源管理以及执行状态监视。

然后在python中使用subprocess模块

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)