In Python, how can I detect whether the computer is on battery power?
Question: I'm playing around with pygame, and one thing I'd like to do is reduce the
number of frames per second when the computer is on battery power (to lower
the CPU usage and extend battery life).

How can I detect, from Python, whether the computer is currently on battery
power?

I'm using Python 3.1 on Windows.


Answer: If you want to do it without `win32api`, you can use the built-in
[`ctypes`](http://docs.python.org/library/ctypes.html) module. I usually run
CPython without `win32api`, so I kinda like these solutions.

It's a tiny bit more work for `GetSystemPowerStatus()` because you have to
define the `SYSTEM_POWER_STATUS` structure, but not bad.

    
    
    # 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
    

On my system that prints this (basically meaning "desktop, plugged in"):

    
    
    ACLineStatus 1
    BatteryFlag -128
    BatteryLifePercent -1
    BatteryLifeTime 4294967295
    BatteryFullLifeTime 4294967295
    

