9

我正在寻找当前的电池容量和设计容量​​。

到目前为止,我可以开始工作的是使用Win32_Battery() 类,它没有提供我需要的所有信息(至少在我的系统上没有)。为此,我使用了纯 python wmi 库

另一方面,我发现这在 Python 中有效,如何检测计算机是否使用电池供电?,但不幸的是,它也没有提供有关容量的任何信息。

电池信息结构电池状态结构似乎非常适合这一点。现在我知道我必须使用DeviceIoControl 函数来执行此操作,并且我发现这个C++ 代码可以稍微解释一下。

我更喜欢只使用 ctypes 而不是pywin32提供的 python win32api 的东西。如果您知道如何在 python 中执行此操作,请告诉我!

提前致谢。

4

7 回答 7

12

Tim Golden's excellent wmi module will, I believe, give you everything you want. You'll just have to do several queries to get everything:

import wmi

c = wmi.WMI()
t = wmi.WMI(moniker = "//./root/wmi")

batts1 = c.CIM_Battery(Caption = 'Portable Battery')
for i, b in enumerate(batts1):
    print 'Battery %d Design Capacity: %d mWh' % (i, b.DesignCapacity or 0)


batts = t.ExecQuery('Select * from BatteryFullChargedCapacity')
for i, b in enumerate(batts):
    print ('Battery %d Fully Charged Capacity: %d mWh' % 
          (i, b.FullChargedCapacity))

batts = t.ExecQuery('Select * from BatteryStatus where Voltage > 0')
for i, b in enumerate(batts):
    print '\nBattery %d ***************' % i
    print 'Tag:               ' + str(b.Tag)
    print 'Name:              ' + b.InstanceName

    print 'PowerOnline:       ' + str(b.PowerOnline)
    print 'Discharging:       ' + str(b.Discharging)
    print 'Charging:          ' + str(b.Charging)
    print 'Voltage:           ' + str(b.Voltage)
    print 'DischargeRate:     ' + str(b.DischargeRate)
    print 'ChargeRate:        ' + str(b.ChargeRate)
    print 'RemainingCapacity: ' + str(b.RemainingCapacity)
    print 'Active:            ' + str(b.Active)
    print 'Critical:          ' + str(b.Critical)

This is certainly not cross-platform, and it requires a 3rd party resource, but it does work very well.

于 2013-05-05T03:05:59.060 回答
11

检索此信息的最可靠方法是使用GetSystemPowerStatus而不是 WMI。psutil在 Linux、Windows 和 FreeBSD 下公开此信息:

>>> import psutil
>>>
>>> def secs2hours(secs):
...     mm, ss = divmod(secs, 60)
...     hh, mm = divmod(mm, 60)
...     return "%d:%02d:%02d" % (hh, mm, ss)
...
>>> battery = psutil.sensors_battery()
>>> battery
sbattery(percent=93, secsleft=16628, power_plugged=False)
>>> print("charge = %s%%, time left = %s" % (battery.percent, secs2hours(battery.secsleft)))
charge = 93%, time left = 4:37:08

相关的提交在这里

于 2017-02-01T19:55:12.217 回答
1
import psutil

battery = psutil.sensors_battery()
plugged = battery.power_plugged
percent = str(battery.percent)

可变百分比将具有电池百分比。我已经使用 python 编写了一小段代码来通知电池何时充满电

https://github.com/Mitzzzzz/Battery-Full-Indicator

好心检查!!

于 2020-05-14T15:08:39.910 回答
1
**Checking the battery percentage in python can be done using the psutil module as 
follows **

# Installing the psutil module
from  pip._internal import  main
main(["install", "psutil"])
import psutil

battery = psutil.sensors_battery();

# checking if the charger is plugged
if battery.power_plugged:
    print("Charging: ", battery.percent)
else:
    print("Not Charging", battery.percent ,"%");
    print( "Discharge time ", int(battery.secsleft)," sec_lft")
于 2020-05-24T16:14:54.297 回答
0

试试这个代码

import psutil
import time
battery = psutil.sensors_battery()
while True:
    print("Battery percentage : ", battery.percent)
    print("Power plugged in : ", battery.power_plugged)
    if battery.percent < 35 and battery.power_plugged == False:
        print("Your battry is low")
    time.sleep(5)

但是这段代码将持续运行,直到它被中断

于 2021-07-18T07:04:29.767 回答
0

使用 Python 了解电池的最简单形式是使用 Psutil 模块...

import psutil    #pip install psutil
battery_detecting = psutil.sensors_battery()
plugged = battery_detecting.power_plugged
percent_battery = str(battery_detecting.percent)
plugged = "Plugged In" if plugged else "Not Plugged In"
print(percent_battery+'% | '+plugged)
于 2021-02-03T02:18:59.537 回答
0

如果您正在谈论电池的完全充电容量,请尝试以下操作:我正在使用 POWERSHELL 非交互式外壳来使用此命令。这是了解电池信息的最简单方法之一。

systeminfo = subprocess.run(["Powershell", "-NonInteractive", "-Command", "Get-WmiObject", "-Namespace",  "'root\wmi'", "-Query",  "'select FullChargedCapacity  from BatteryFullChargedCapacity'"], capture_output=True).stdout.decode().strip()
print(systeminfo[292:-21])

注意: 这仅适用于 WINDOWS

于 2021-08-21T10:43:11.037 回答