Shell脚本将我的python脚本中第二个数字之后的所有数字转换为零



我有一个python脚本,可以计算mac上使用的内存。它通过终端运行良好:即。$>python freeMem.py | grep 'Memory Used' | awk '{print $5 }'14264

**

  • freeMem.py:

**

# Get process info
ps = subprocess.Popen(['ps', '-caxm', '-orss,comm'], stdout=subprocess.PIPE).communicate()[0].decode()
vm = subprocess.Popen(['vm_stat'], stdout=subprocess.PIPE).communicate()[0].decode()
# Iterate processes
processLines = ps.split('n')
sep = re.compile('[s]+')
rssTotal = 0 # kB
for row in range(1,len(processLines)):
rowText = processLines[row].strip()
rowElements = sep.split(rowText)
try:
rss = float(rowElements[0]) * 1024
except:
rss = 0 # ignore...
rssTotal += rss
# Process vm_stat
vmLines = vm.split('n')
sep = re.compile(':[s]+')
vmStats = {}
for row in range(1,len(vmLines)-2):
rowText = vmLines[row].strip()
rowElements = sep.split(rowText)
vmStats[(rowElements[0])] = int(rowElements[1].strip('.')) * 4096

#App_Memory =  sysctl vm.page_pageable_internal_count - Pages Purgable (from vm_stat)
cmd = "sysctl vm.page_pageable_internal_count"
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
(out, rc) = proc.communicate()
vmpage_pageable_internal_count = out.strip().decode('ascii').split(': ')[1]
vmpage_pageable_internal_count = int(vmpage_pageable_internal_count) * 4096
#print("Purgable internal count %d" % (vmpage_pageable_internal_count))
AppMemory = (vmpage_pageable_internal_count - vmStats["Pages purgeable"])/1024/1024
WiredMemory = vmStats["Pages wired down"]/1024/1024
ActiveMemory = vmStats["Pages active"]/1024/1024
InactiveMemory = vmStats["Pages inactive"]/1024/1024
CompressedMemory = vmStats["Pages occupied by compressor"] /1024/1024
UsedMemory = AppMemory + WiredMemory + CompressedMemory
print('Memory Used: %.3f GB %d MB' % (float(UsedMemory/1024), float(UsedMemory/1024 * 1000)))

然而,当我试图通过任何shell脚本调用它时,即:在appescapet或os.system或subces中执行shell脚本。Popen、run、call等……或者甚至通过bash中的反勾"命令,它只会返回前两位数字,其余的都是零?:即:./doGetMemUsed.sh14000

doGetMemUsed.sh:的内容

out=$(python freeMem.py | grep 'Memory Used' | awk '{print $5 }')
echo $out

注意到最后3位数字全部消失,并转换或四舍五入到0?

我还需要得到最后3位数字,因为这些数字代表使用的MB,才能正确计算。四舍五入到GB对于我的应用程序来说不够准确。

我曾尝试在bash脚本中使用10#指定十进制,但没有成功。我已经尝试在我的python脚本中将其转换为整数,但仍然没有成功。

我能让它工作的唯一方法就是直接在终端打电话。但是,我无法通过任何脚本机制实现自动化,因为它将依赖于下面的shell。

有什么建议吗?

如果您在shell脚本中进行任何运算,请注意大多数shell(ksh是一个例外(都不能进行浮点运算。你可能在做这样的事情:

$ x=14264789
$ echo $((x / 10**6 * 10**3))
14000

在你的问题中填写更多的细节。

最新更新