我试图在我的python脚本中获取外部程序的内存使用情况。我尝试使用脚本http://code.activestate.com/recipes/286222/,如下所示:
m0 = memory()
subprocess.call('My program')
m1 = memory(m0)
print m1
但这似乎只是给了我python脚本的内存使用而不是'我的程序'。有没有办法输出程序的内存使用情况以便在python脚本中使用?
答案 0 :(得分:6)
尝试使用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 :(得分:1)
您可能想要查看psutil模块:http://code.google.com/p/psutil/。主页上的“进程管理”部分为您提供了获取pid指定的正在运行的进程的内存使用情况的示例。
您是否也希望在脚本中生成您正在监视的进程?如果是这样,你可能不想使用subprocess.call,因为这将等待程序退出,你将无法在它运行时监视它。如果你想生成进程然后监视它,你可能想要使用Popen http://docs.python.org/library/subprocess.html#subprocess.Popen。这将允许您生成进程,获取pid,将pid交给psutil,然后监视内存使用情况。
答案 2 :(得分:1)
如果您查看食谱,您将看到以下行:
_proc_status = '/proc/%d/status' % os.getpid()
我建议您将os.getpid()
替换为子进程的进程ID。正如@Neal所说,在我输入时,您需要使用Popen
并获取返回对象的pid
属性。
但是,您可能遇到竞争条件,因为您不知道子进程处于什么状态,并且内存使用情况会有所不同。
答案 3 :(得分:1)
我知道这是一篇较旧的帖子,但这是我在谷歌发布此问题时唯一出现的帖子,所以,我想添加更新版本:
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)
我在这里使用了人性化,使价值更具可读性,但并不是必需的。
RSS和VMS值在所有操作系统上,根据您使用的操作系统,可能还有其他值:https://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info