以下是替换os.system调用的方法
In [131]: from subprocess import Popen, PIPE
In [132]: p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()], shell=False, stdout=PIPE)
In [133]: p.communicate()
Out[133]: ('VmRSS:\t 340832 kB\n', None)
我也没有问题运行您觉得有问题的线路:
In [134]: print resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
340840
编辑
rusage问题很可能是一个依赖于内核的问题,在您的红帽dist上根本不可用
http://bytes.com/topic/python/answers/22489-getrusage
当然,您可以在代码中有一个单独的线程来查看当前的使用情况,并在代码执行过程中进行存储,并存储观察到的最高值
编辑2
这里有一个完整的解决方案,通过Popen跳过资源和监视使用情况。检查的频率当然必须是相关的,但不是频繁的,这样会占用所有的cpu。
#!/usr/bin/env python
import threading
import time
import re
import os
from subprocess import Popen, PIPE
maxUsage = 0
keepThreadRunning = True
def memWatch(freq=20):
global maxUsage
global keepThreadRunning
while keepThreadRunning:
p = Popen(["grep", "VmRSS", "/proc/%s/status" % os.getpid()],
shell=False, stdout=PIPE)
curUsage = int(re.search(r'\d+', p.communicate()[0]).group())
if curUsage > maxUsage:
maxUsage = curUsage
time.sleep(1.0 / freq)
if __name__ == "__main__":
t = threading.Thread(target=memWatch)
t.start()
print maxUsage
[p for p in range(1000000)]
print maxUsage
[str(p) for p in range(1000000)]
print maxUsage
keepThreadRunning = False
t.join()
memWatch函数可以通过计算一次睡眠时间来优化,而不是在进入while循环之前重新格式化每个循环的进程路径和编译正则表达式。但总而言之,我希望这就是你所追求的功能。