首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >圆形系统RAM和HDD字节,达到最接近甚至千兆字节。Python

圆形系统RAM和HDD字节,达到最接近甚至千兆字节。Python
EN

Stack Overflow用户
提问于 2015-04-14 12:45:58
回答 3查看 1.8K关注 0票数 2

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

简单地说,我如何将内部规范的显示转换成您从消费者/商业立场所看到的样子?

1000 8GB的HDD或8GB RAM,而不是可用的确切字节数。特别是由于制造商预留了不同数量的恢复扇区,RAM可用于集成图形和1000 vs 1024二进制差等。下面是我当前代码的一个示例:

代码语言:javascript
复制
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,在这里,我将向上到最近的,甚至号,因为内存/硬盘的内部大小总是低于广告中的原因。StackOverflow文章给了我这个方法,它是最精确的,在大多数机器上,但是它仍然是硬编码的。这意味着HDD只对数百GB或数千GB都准确,而不是两者兼而有之。另外,RAM也不是100%的精确性。

以下是我想出的几个解决办法,它们将产生我正在寻找的结果:

  • RAMTOTAL添加其他命令,这些命令可能可用,也可能不可用。允许使用GB输出而不是KB。然而。我希望它是WMI导入的一部分,而不是直接的本地Windows代码。
  • 找出一种更静态的舍入方法。ie:if HDDTOTAL > 1TB加到小数点,Xelse HDDTOTAL < 1TB使用不同的舍入方法。
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-18 21:08:53

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

我使用了if循环,而不是while循环,但是得到了相同的结果。我还镜像了建议的powershell命令的相同内部进程,以使脚本更适合python,而无需添加模块/依赖项。

代码语言:javascript
复制
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容量。无论集成图形决定消耗和/或保留HDD上扇区的RAM,等等.

票数 0
EN

Stack Overflow用户

发布于 2015-04-14 15:18:15

我想你可以写一个简单的函数来解决这个问题。如果kB中的数字要小得多或者更大,我增加了不同后缀的可能性(这是由一本书中关于Python3的非常相似的例子启发而来的)。它看起来可能是这样的:

代码语言:javascript
复制
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]

此函数的结果可能如下所示:

代码语言:javascript
复制
>>> print(round(19276246))
(20, 'GB')
>>> print(round(135565666656))
(136, 'TB')
>>> print(round(1355))
(2, 'MB')

您可以将其实现为代码,如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-04-14 15:08:30

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

因此,要查看总物理内存四舍五入1 GB,这是如何做到这一点:

代码语言:javascript
复制
get-wmiobject -Class Win32_ComputerSystem | 
select @{Name='Ram(GB)';Expression={[int]($_.TotalPhysicalMemory /1GB)}}

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

代码语言:javascript
复制
[int]($_.TotalPhysicalMemory /1GB)

我使用的表达式开始于括号中,在这里我得到了TotalPhysicalMemory (返回值为17080483840)。然后,我除以1GB给我15.9074401855469。最后,我应用int将整件事情转换为整数,也就是说,使它成为整数,并酌情舍入。

这是输出

代码语言:javascript
复制
>Ram(GB)
-------
 16
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29627713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档