我正在玩pygame,我想做的一件事是当计算机使用电池电源时减少每秒的帧数(以降低CPU使用率并延长电池寿命)。我如何从Python中检测计算机当前是否使用电池供电?我在Windows上使用Python 3.1。
mwyxok5s1#
如果不想使用win32api,可以使用内置的ctypes模块,我通常不使用win32api运行CPython,所以我有点喜欢这些解决方案。对于GetSystemPowerStatus()来说,这稍微多了一点工作,因为您必须定义SYSTEM_POWER_STATUS结构,但还不错。
win32api
ctypes
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
pexxcrt22#
在C中检索此信息最可靠的方法是使用GetSystemPowerStatus。如果没有电池,ACLineStatus将被设置为128。psutil在Linux、Windows和FreeBSD下显示此信息,因此要检查电池是否存在,您可以这样做
ACLineStatus
128
>>> 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 >>>
twh00eeo3#
这很简单,你所要做的就是从Python调用Windows API函数GetSystemPowerStatus,可能是通过导入win32api模块。
编辑:GetSystemPowerStatus()尚未在构建版本219(2014年5月4日)的win32api中实现。
hmmo2u0o4#
跨平台电源状态指示的一个简单方法是使用pip安装“电源”模块
import power ans = power.PowerManagement().get_providing_power_source_type() if not ans: print "plugged into wall socket" else: print "on battery"
b4lqfgs45#
您可以安装acpi。在计算机中,高级配置和电源接口提供了一个开放标准,操作系统可以使用该标准来发现和配置计算机硬件组件,通过将不使用的组件置于睡眠状态来执行电源管理,以及执行状态监视。然后使用python中的subprocess模块
acpi
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)
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-packagesdir * 中的一个(如我在 * 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 * 来检索电池信息。
6条答案
按热度按时间mwyxok5s1#
如果不想使用
win32api
,可以使用内置的ctypes
模块,我通常不使用win32api
运行CPython,所以我有点喜欢这些解决方案。对于
GetSystemPowerStatus()
来说,这稍微多了一点工作,因为您必须定义SYSTEM_POWER_STATUS
结构,但还不错。在我的系统上打印这个(基本意思是“桌面,插入”):
pexxcrt22#
在C中检索此信息最可靠的方法是使用GetSystemPowerStatus。如果没有电池,
ACLineStatus
将被设置为128
。psutil在Linux、Windows和FreeBSD下显示此信息,因此要检查电池是否存在,您可以这样做如果有电池,并且您想知道电源线是否已插入,可以执行以下操作:
twh00eeo3#
这很简单,你所要做的就是从Python调用Windows API函数GetSystemPowerStatus,可能是通过导入
win32api
模块。编辑:
GetSystemPowerStatus()
尚未在构建版本219(2014年5月4日)的win32api
中实现。hmmo2u0o4#
跨平台电源状态指示的一个简单方法是使用pip安装“电源”模块
b4lqfgs45#
您可以安装
acpi
。在计算机中,高级配置和电源接口提供了一个开放标准,操作系统可以使用该标准来发现和配置计算机硬件组件,通过将不使用的组件置于睡眠状态来执行电源管理,以及执行状态监视。
然后使用python中的
subprocess
模块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-packagesdir * 中的一个(如我在 * Test * 部分中所解释的),生成:
检查[SO]: How to change username of job in print queue using python & win32print (@CristiFati's answer)(在最后),了解从(上面的)补丁中获益的可能方法。
值得一提的是(如果@giampaolo-rodolàs的回答不够清楚的话),[PyPI]: psutil还使用 * GetSystemPowerStatus * 来检索电池信息。