我正在收集当前机器的系统信息。部分信息是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
向上舍入到小数点X
。 else HDDTOTAL < 1TB
使用不同的舍入方法。
答案 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上的扇区等等......