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

68de4m5k  于 2023-02-05  发布在  Windows
关注(0)|答案(6)|浏览(146)

我正在玩pygame,我想做的一件事是当计算机使用电池电源时减少每秒的帧数(以降低CPU使用率并延长电池寿命)。
我如何从Python中检测计算机当前是否使用电池供电?
我在Windows上使用Python 3.1。

mwyxok5s

mwyxok5s1#

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

pexxcrt22#

在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
>>>
twh00eeo

twh00eeo3#

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

编辑:GetSystemPowerStatus()尚未在构建版本219(2014年5月4日)的win32api中实现。

hmmo2u0o

hmmo2u0o4#

跨平台电源状态指示的一个简单方法是使用pip安装“电源”模块

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

b4lqfgs45#

您可以安装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)
bq8i3lrv

bq8i3lrv6#

尸体解剖。
[SO]: In Python, how can I detect whether the computer is on battery power? (@BenHoyt's answer)是可移植的,不需要额外的包,但它受到 * CTypes WinTypes )错误的负面影响(直到 * Pythonv3.12)。
有关错误的更多详细信息(以及修复和解决方法):[SO]: Why ctypes.wintypes.BYTE is signed, but native windows BYTE is unsigned? (@CristiFati's answer).
无论如何,我提交了**[GitHub]: mhammond/pywin32 - Add GetSystemPowerStatus wrapper,以使 * GetSystemPowerStatus * 函数在 * Win32API * 中可用。
在本地构建 * win32api.pyd * 并覆盖 * site-packages
dir * 中的一个(如我在 * Test * 部分中所解释的),生成:

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q006153860]> "e:\Work\Dev\VEnvs\py_pc064_03.10_test1_pw32\Scripts\python.exe" -c "import win32api as wapi;from pprint import pprint as pp;pp(wapi.GetSystemPowerStatus(), sort_dicts=0);print(\"\nDone.\n\")"
{'ACLineStatus': 1,
 'BatteryFlag': 1,
 'BatteryLifePercent': 100,
 'SystemStatusFlag': 0,
 'BatteryLifeTime': 4294967295,
 'BatteryFullLifeTime': 4294967295}

Done.

检查[SO]: How to change username of job in print queue using python & win32print (@CristiFati's answer)(在最后),了解从(上面的)补丁中获益的可能方法。
值得一提的是(如果@giampaolo-rodolàs的回答不够清楚的话),[PyPI]: psutil还使用 * GetSystemPowerStatus * 来检索电池信息。

相关问题