1

我正在尝试在我的 python 脚本中获取外部程序的内存使用情况。我尝试使用脚本http://code.activestate.com/recipes/286222/如下:

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

但这似乎只是给了我 python 脚本的内存使用情况,而不是“我的程序”。有没有办法输出程序的内存使用情况以在 python 脚本中使用?

4

4 回答 4

7

尝试使用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)
于 2012-09-04T14:02:53.407 回答
1

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

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

于 2012-09-04T13:09:44.703 回答
1

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

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

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

但是,您可能会遇到竞争条件,因为您不知道子进程处于什么状态,并且内存使用量无论如何都会有所不同。

于 2012-09-04T13:13:29.177 回答
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)

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

RSS 和 VMS 值在所有操作系统上,根据您使用的操作系统可能还有其他值:https ://psutil.readthedocs.io/en/latest/#psutil.Process.memory_info

于 2018-01-04T21:52:05.893 回答