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

22 投票
6 回答
12040 浏览
提问于 2025-04-16 18:28

我正在玩pygame这个库,有一件事我想做,就是在电脑使用电池供电的时候,减少每秒显示的帧数(这样可以降低CPU的使用率,延长电池的使用时间)。

我该怎么在Python中检测电脑现在是否在用电池供电呢?

我在Windows上使用的是Python 3.1。

6 个回答

4

这很简单,你只需要在Python中调用Windows的一个API函数 GetSystemPowerStatus,可能需要导入 win32api 模块。

编辑:截至2014年5月4日的219版本,win32api 中还没有实现 GetSystemPowerStatus()

11

在C语言中,获取这些信息最可靠的方法是使用GetSystemPowerStatus这个函数。如果没有电池,ACLineStatus的值会被设置为128。在Linux、Windows和FreeBSD系统中,psutil库可以提供这些信息,所以要检查是否有电池,可以这样做:

>>> 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
>>> 
19

如果你想不使用 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

撰写回答