2012-09-04 54 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

相關問題