我正在收集当前机器的系统信息。这些信息的一部分是RAM和HDD容量。问题是所收集的容量是以字节而不是GB来衡量的。
简单地说,我如何将内部规范的显示转换成您从消费者/商业立场所看到的样子?
1000 8GB的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,在这里,我将向上到最近的,甚至号,因为内存/硬盘的内部大小总是低于广告中的原因。StackOverflow文章给了我这个方法,它是最精确的,在大多数机器上,但是它仍然是硬编码的。这意味着HDD只对数百GB或数千GB都准确,而不是两者兼而有之。另外,RAM也不是100%的精确性。
以下是我想出的几个解决办法,它们将产生我正在寻找的结果:
RAMTOTAL添加其他命令,这些命令可能可用,也可能不可用。允许使用GB输出而不是KB。然而。我希望它是WMI导入的一部分,而不是直接的本地Windows代码。if HDDTOTAL > 1TB加到小数点,X。else HDDTOTAL < 1TB使用不同的舍入方法。发布于 2015-04-18 21:08:53
我使用了前两项建议的组合。
我使用了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容量。无论集成图形决定消耗和/或保留HDD上扇区的RAM,等等.
发布于 2015-04-14 15:18:15
我想你可以写一个简单的函数来解决这个问题。如果kB中的数字要小得多或者更大,我增加了不同后缀的可能性(这是由一本书中关于Python3的非常相似的例子启发而来的)。它看起来可能是这样的:
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)发布于 2015-04-14 15:08:30
PowerShell内置了许多非常强大的本地数学功能,允许我们做一些事情,比如除以1GB来获得特定驱动器的千兆字节的整数。
因此,要查看总物理内存四舍五入1 GB,这是如何做到这一点:
get-wmiobject -Class Win32_ComputerSystem |
select @{Name='Ram(GB)';Expression={[int]($_.TotalPhysicalMemory /1GB)}}这个方法被称为计算属性,它与使用常规select语句(如Select )的不同之处在于,我告诉TotalPhysicalMemory创建一个新的Prop (GB),并使用下面的表达式来确定它的值。
[int]($_.TotalPhysicalMemory /1GB)我使用的表达式开始于括号中,在这里我得到了TotalPhysicalMemory (返回值为17080483840)。然后,我除以1GB给我15.9074401855469。最后,我应用int将整件事情转换为整数,也就是说,使它成为整数,并酌情舍入。
这是输出
>Ram(GB)
-------
16https://stackoverflow.com/questions/29627713
复制相似问题