2012-09-04 53 views
1

我想在我的python脚本中获取外部程序的内存使用情况。我已经使用脚本试图http://code.activestate.com/recipes/286222/如下:如何获得外部程序的内存使用情况 - python

m0 = memory() 
subprocess.call('My program') 
m1 = memory(m0) 
print m1 

但这似乎只是给我的python脚本的内存使用量,而不是“我的计划”。有没有一种方法可以输出在python脚本中使用的程序的内存使用情况?

+3

注意'()调用'等待进程退出。因此,你不能通过使用'call()'的python脚本来测量它的内存使用情况。 –

回答

1

如果你看一下食谱,你会看到一行:

_proc_status = '/proc/%d/status' % os.getpid() 

我建议你与你的子进程的进程ID替换os.getpid()。正如@Neal所说,与我输入此时一样,您需要使用Popen并获取返回对象的pid属性。

但是,您有可能的竞争条件,因为您不知道子进程处于何种状态,并且内存使用情况也会有所不同。

+0

感谢这个工程,虽然它的棘手找出一种方法来查找peek内存使用情况。 – user1644254

+0

@ user1644254:我同意,'psutil'可能是更好的解决方案 - 我试图重用您的代码。你可能会更好地在子程序本身内部使用探查器或诸如'getrusage'之类的东西来监视它(尽管这会改变你正在测试的东西)。你说孩子写的是哪种语言? – cdarke

+0

我正在使用的程序是geant 4 http://geant4.cern.ch/support/userdocuments.shtml问题是我不能真正使用代码内的外部程序,只有标准的python库。我设法解决了这个问题,我把当前内存的样本放入一个列表中,并根据需要计算最大和平均内存。 – user1644254

1

您可能想查看psutil模块:http://code.google.com/p/psutil/。主页上的Process Management部分为您提供了获取由pid指定的正在运行的进程的内存使用情况的示例。

您是否想在脚本中产生您正在监控的进程?如果是这样,您可能不想使用subprocess.call,因为这将等待程序退出,并且在运行时您将无法对其进行监视。如果你想产卵的过程,然后监测它,你可能想要使用Popen http://docs.python.org/library/subprocess.html#subprocess.Popen。这将允许您产生进程,获得pid,将pid交给psutil,然后监视内存使用情况。

6

使用try Psutil

import psutil 
import subprocess 
import time 

SLICE_IN_SECONDS = 1 
p = subprocess.Popen('calling/your/program') 
resultTable = [] 
while p.poll() == None: 
    resultTable.append(psutil.get_memory_info(p.pid)) 
    time.sleep(SLICE_IN_SECONDS) 
+1

'''while p.poll()== None:'''会更好。 Popen.poll()返回Popen.returncode,它是None,直到进程终止。 – y0prst

+0

谢谢,作了一个更正 –

0

我知道这是一个老帖子,但它是当我谷歌这个问题出现的只有一个,所以,我想补充的这个更新版本:

import psutil 
import humanfriendly 

proc = subprocess.Popen("...Your process...") 
SLICE_IN_SECONDS = 1 
while proc.poll() is None: 
    p = psutil.Process(proc.pid) 
    mem_status = "RSS {}, VMS: {}".format(humanfriendly.format_size(p.memory_info().rss), 
       humanfriendly.format_size(p.memory_info().vms)) 
    time.sleep(SLICE_IN_SECONDS) 
    print(mem_status) 

我在这里使用了humanfriendly,使值更具可读性,但它不是必需的。

的RSS和VMS值在所有操作系统,并且有可能是取决于你使用的操作系统的其他值:https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info

相关问题