【问题标题】:Getting Battery Capacity in Windows with Python使用 Python 在 Windows 中获取电池容量
【发布时间】:2013-05-05 01:00:17
【问题描述】:

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

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

另一方面,我发现它可以工作 In Python, how can I detect whether the computer is on battery power?,但不幸的是它也没有提供任何有关容量的信息。

Battery Information structureBattery Status structure 似乎很适合这个。现在我知道我必须使用DeviceIoControl function 这样做,我发现这个C++ code 解释了一点。

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

提前致谢。

【问题讨论】:

  • 我假设您不想使用win32api,因为您想在其他平台上使用代码,所以我不确定其他方法可以做到这一点,因为所有系统都有不同的 API。如果您不需要其他平台,我可以帮助您
  • 我的代码适用于 linux 和 mac os。我现在正在尝试为 Windows 获取一些东西,pywin32、win32api 就可以了。我最初只是想避免有外部库需求。

标签: python windows ctypes pywin32 battery


【解决方案1】:

我相信,Tim Golden 出色的 wmi 模块会为您提供所需的一切。您只需执行几个查询即可获得所有信息:

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)

这当然不是跨平台的,它需要第三方资源,但它确实工作得很好。

【讨论】:

  • 我已经尝试过了,但出现了两个问题。首先,据我所知,CIM_Battery 类并没有给你当前的容量。它通常似乎也没有给我大部分数据(意味着我得到 0 或其他默认值)。最后一部分看起来很有趣,我会尝试一下,让你知道它是否有效。
  • 非常感谢,几乎解决了我所有的问题。我还有一个问题,DesignCapacity 总是为我返回 0。我尝试执行查询和所有操作,但即使是那些也只会给我错误。我正在使用 Windows 8 在 bootcamp 上对此进行测试,所以这可能是那里的问题,但我现在可以在没有 DesignCapacity 的情况下生活。非常感谢您的帮助。
【解决方案2】:

检索此信息的最可靠方法是使用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

相关的提交是here

【讨论】:

  • 里面有很多问题(也许只对我来说).
  • psutil.sensors_battery() 如果使用 HP 机器上的电池供电,则返回 None superuser.com/questions/1394191/…
  • @Valentyn 不适合我(HP Spectre x360 Convertible)
【解决方案3】:
import psutil

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

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

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

请查收!!

【讨论】:

  • 为什么 'secsleft=4294967295' ???现在是 19884 小时。我的电量只有 30%
  • @AlexZab 这很可能意味着它能够检索 secsleft... 因为这个数字 4294967295 似乎是无符号 32 位整数的最大限制, 表示失败
【解决方案4】:
**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")

【讨论】:

  • \为什么'secsleft=4294967295' ???现在是 19884 小时。我的电量只有 30%
  • 我不确定,很久让我去检查文档,然后我会回复你但我认为这些单位实际上并不是第二个跨度>
  • 继续检查这个脚本,它可以帮助您获得实际剩余时间。如果它不能帮助你打我,我会为你解决它。 github.com/giampaolo/psutil/blob/master/scripts/battery.py
【解决方案5】:

使用 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)

【讨论】:

    【解决方案6】:

    试试这个代码

    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)
    

    但是这段代码会一直运行直到被中断

    【讨论】:

      【解决方案7】:

      如果您谈论的是电池的完全充电容量,请尝试以下操作: 我正在使用 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多