在Python中,如何检测计算机是否使用电池电源?
我正在玩 pygame,我想做的一件事是减少计算机使用电池供电时每秒的帧数(以降低 CPU 使用率并延长电池寿命)。
如何从 Python 检测计算机当前是否使用电池供电?
我在 Windows 上使用 Python 3.1。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
如果您想在没有
win32api
的情况下执行此操作,可以使用内置的ctypes
模块。我通常在没有win32api
的情况下运行 CPython,所以我有点喜欢这些解决方案。GetSystemPowerStatus()
的工作量要多一点,因为您必须定义SYSTEM_POWER_STATUS
结构,但也不错。在我的系统上打印此内容(基本上意味着“桌面,已插入”):
If you want to do it without
win32api
, you can use the built-inctypes
module. I usually run CPython withoutwin32api
, so I kinda like these solutions.It's a tiny bit more work for
GetSystemPowerStatus()
because you have to define theSYSTEM_POWER_STATUS
structure, but not bad.On my system that prints this (basically meaning "desktop, plugged in"):
在 C 中检索此信息的最可靠方法是使用 获取系统电源状态。如果没有电池,
ACLineStatus
将设置为128
。 psutil 在 Linux、Windows 和 FreeBSD 下公开此信息,因此要检查电池是否存在,您可以执行以下操作:有电池并且您想知道电源线是否已插入,您可以执行以下操作:
The most reliable way to retrieve this information in C is by using GetSystemPowerStatus. If no battery is present
ACLineStatus
will be set to128
. psutil exposes this information under Linux, Windows and FreeBSD, so to check if battery is present you can do thisIf a battery is present and you want to know whether the power cable is plugged in you can do this:
很简单,你所要做的就是调用Windows API函数GetSystemPowerStatus 从 Python,可能通过导入win32api
模块。编辑:自 build 219 (2014-05-04) 起,
Win32api
尚未实现GetSystemPowerStatus()
。It is easy, all you have to do is to call Windows API function GetSystemPowerStatus from Python, probably by importingwin32api
module.EDIT:
GetSystemPowerStatus()
is not yet implemented inwin32api
as of build 219 (2014-05-04).跨平台电源状态指示的一个简单方法是“电源”模块,您可以使用 pip 安装该模块
A simple method for cross platform power status indication is the 'power' module which you can install with pip
您可以安装
acpi
。来自维基百科然后使用python中的
subprocess
模块You can install
acpi
.From wikipediaThen use the
subprocess
module in python[SO]:在Python中,如何检测计算机是否使用电池电源? (@BenHoyt 的回答) 是可移植的,不需要额外的包,但它受到 CTypes 的负面影响(直到Python v3.12) (WinTypes)错误。
有关错误的更多详细信息(以及修复、解决方法):[SO]:为什么 ctypes.wintypes.BYTE 已签名,但本机 Windows BYTE 是未签名? (@CristiFati 的回答)。
无论如何,我提交了 [GitHub]:mhammond/pywin32 - 添加 GetSystemPowerStatus 包装器 GetSystemPowerStatus 函数在 Win32API 中可用。
在本地构建 win32api.pyd 并覆盖 site-packages 目录中的文件(正如我在测试部分中提到的),会产生:
检查[SO]:如何使用 python & 更改打印队列中作业的用户名win32print(@CristiFati 的回答)(最后)了解从(上述)补丁中受益的可能方法。
值得一提(如果[SO]:在Python中,如何检测计算机是否使用电池电源?(@GiampaoloRodolà的回答) 对此还不够清楚)[PyPI]: psutil 还使用 GetSystemPowerStatus 来检索电池信息。
[SO]: In Python, how can I detect whether the computer is on battery power? (@BenHoyt's answer) is portable and doesn't require extra packages, but it's negatively impacted (until Python v3.12) by a CTypes (WinTypes) bug.
More details about the bug (and fix, workaround): [SO]: Why ctypes.wintypes.BYTE is signed, but native windows BYTE is unsigned? (@CristiFati's answer).
Anyway, I submitted [GitHub]: mhammond/pywin32 - Add GetSystemPowerStatus wrapper for GetSystemPowerStatus function to be available in Win32API.
Building win32api.pyd locally and overwriting the one from site-packages directory (as I mentioned in the Test section), yields:
Check [SO]: How to change username of job in print queue using python & win32print (@CristiFati's answer) (at the end) for possible ways to benefit from the (above) patch.
Worth mentioning (if [SO]: In Python, how can I detect whether the computer is on battery power? (@GiampaoloRodolà's answer) is not clear enough about it) that [PyPI]: psutil also uses GetSystemPowerStatus in order to retrieve battery information.