圆形系统RAM和HDD字节,UP到最接近的甚至千兆字节。蟒蛇

时间:2015-04-14 12:45:59

标签: python math wmi rounding

我正在收集当前机器的系统信息。部分信息是RAM和HDD容量。问题是收集的容量是以字节而不是GB来衡量的。

简而言之,我如何将内部规格的显示转换为您从消费者/商业角度看到的内容?

1000GB HDD或8GB RAM,而不是可用的确切字节数。特别是因为制造商预留了不同数量的恢复扇区,RAM可以用于集成显卡和1000 vs 1024二进制差分等等......这是我当前代码的一个例子:

import os
import wmi #import native powershell functionality
import math

c = wmi.WMI()  
SYSINFO = c.Win32_ComputerSystem()[0]    # Manufacturer/Model/Spec blob

RAMTOTAL = int(SYSINFO.TotalPhysicalMemory)        # Gathers only the RAM capacity in bytes.
RAMROUNDED = math.ceil(RAMTOTAL / 2000000000.) * 2.000000000        # attempts to round bytes to nearest, even, GB.
HDDTOTAL = int(HDDINFO.size) # Gathers only the HDD capacity in bytes.
HDDROUNDED = math.ceil(HDDTOTAL / 2000000000.) * 2.000000000        # attempts to round bytes to nearest, even, GB.
HDDPRNT = "HDD: " + str(HDDROUNDED) + "GB"
RAMPRNT = "RAM: " + str(RAMROUNDED) + "GB"
print(HDDPRNT)
print(RAMPRNT)


感兴趣的区域是行8-11,因为RAM的内部大小,我将向上舍入到最近的甚至数字由于前面提到的原因,HDD总是低于广告。 StackOverflow帖子让我得到了这种方法,这种方法在大多数机器上都是最准确的,但它仍然是硬编码的。这意味着硬盘只能准确地为数百GB或数千,而不是两者。此外,RAM不是100%准确。

以下是一些可以产生我正在寻找的结果的解决方法:

  • RAMTOTAL添加可能有效或无法使用的其他命令。允许GB输出而不是KB。然而。我希望它是WMI导入的一部分,而不是直接的原生Windows代码。

  • 找出一种更静态的舍入方法。即:if HDDTOTAL > 1TB向上舍入到小数点Xelse HDDTOTAL < 1TB使用不同的舍入方法。

3 个答案:

答案 0 :(得分:2)

我认为你可以编写一个解决它的简单函数。如果以kB为单位的数字明显更小或更大,我添加了不同后缀的可能性(它的灵感来自Dive Into Python 3中的非常相似的例子)。它可能看起来像这样:

def round(x):
    a = 0
    while x > 1000:
        suffixes = ('kB','MB','GB','TB')
        a += 1 #This will go up the suffixes tuple with each division
        x = x /1000
    return math.ceil(x), suffixes[a]

此功能的结果可能如下所示:

>>> print(round(19276246))
(20, 'GB')
>>> print(round(135565666656))
(136, 'TB')
>>> print(round(1355))
(2, 'MB')

你可以像这样在你的代码中实现它:

import os
import wmi #import native powershell functionality
import math

def round(x):
    a = 0
    while x > 1000:
        suffixes = ('kB','MB','GB','TB')
        a += 1 #This will go up the suffixes tuple for each division
        x = x /1000
    return math.ceil(x), suffixes[a]

    .
    .
    .

RAMROUNDED = round(RAMTOTAL)       #attempts to round bytes to nearest, even, GB.
HDDTOTAL = int(HDDINFO.size) # Gathers only the HDD capacity in bytes.
HDDROUNDED = round(HDDTOTAL)        #attempts to round bytes to nearest, even, GB.
HDDPRNT = "HDD: " + str(HDDROUNDED[0]) + HDDROUNDED[1]
RAMPRNT = "RAM: " + str(RAMROUNDED[0]) + RAMROUNDED[1]
print(HDDPRNT)
print(RAMPRNT)

答案 1 :(得分:1)

PowerShell内置了许多非常强大的本机数学功能,允许我们做一些事情,比如除以1GB以获得特定驱动器的整数千兆字节。

因此,要查看总体物理内存四舍五入,这是如何做到的:

get-wmiobject -Class Win32_ComputerSystem | 
select @{Name='Ram(GB)';Expression={[int]($_.TotalPhysicalMemory /1GB)}}

此方法称为计算属性,它与使用常规select语句(如Select TotalPhysicalMemory)的不同之处在于我告诉PowerShell创建一个新的Prop调用Ram(GB)并使用以下表达式来确定它的价值。

[int]($_.TotalPhysicalMemory /1GB)

我正在使用的表达式在括号中开始,我将获得TotalPhysicalMemory(返回17080483840)。然后我除以1GB给我15.9074401855469。最后,我应用[int]将整个事物转换为一个整数,也就是说,使它成为一个整数,并在适当的时候进行舍入。

这是输出

>Ram(GB)
-------
 16

答案 2 :(得分:0)

我使用了之前两个建议的组合。

我使用了if循环,而不是while循环,但获得了相同的结果。我还镜像了建议的powershell命令的相同内部过程,以使脚本更加原生于python并且不添加模块/依赖项。

GBasMB = int(1000000000) # Allows for accurate Bytes to GB conversion

global RAMSTRROUNDED
RAMTOTAL = int(SYSINFO.TotalPhysicalMemory) / (GBasMB) # Outputs GB by dividing by previous MB variable
RAMROUNDED = math.ceil(RAMTOTAL / 2.) * 2 # Rounds up to nearest even whole number
RAMSTRROUNDED = int(RAMROUNDED) # final converted variable

HDDTOTAL = int(HDDINFO.size) / (GBasMB) # Similar process as before for HardDrive
HDDROUNDED = math.ceil(HDDTOTAL / 2.) * 2 # round up to nearest even whole number

def ROUNDHDDTBORGB(): # function for determining TB or GB sized HDD
    global HDDTBORGBOUTPUT
    global HDDPRNT
    if HDDROUNDED >= 1000: # if equal to or greater than 1000GB, list as 1TB
        HDDTBORGB = HDDROUNDED * .001
        HDDTBORGBOUTPUT = str(HDDTBORGB) + "TB"
        HDDPRNT = "HDD: " + str(HDDTBORGBOUTPUT)
        print(HDDPRNT)
    elif HDDROUNDED < 1000: # if less than 1000GB list as GB
        HDDTBORGBOUTPUT = str(str(HDDROUNDED) + "GB")
        HDDPRNT = "HDD: " + str(HDDTBORGBOUTPUT)

我在几十台计算机上运行了这个脚本,似乎准确地收集了适当数量的RAM和HDD容量。无论集成显卡决定消耗多少RAM和/或保留HDD上的扇区等等......