在Python中,如何检测电脑是否使用电池供电?
我正在玩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