python - > suprocess.Popen获取进程ID的内存使用情况

时间:2015-03-23 08:12:15

标签: python-2.7

我试图通过带有win7 64的python标准库的python脚本来获取python进程本身的内存使用情况。我搜索了一个解决方案并得到: http://fa.bianp.net/blog/2013/different-ways-to-get-memory-consumption-or-lessons-learned-from-memory_profiler/

def memory_usage_ps():
import subprocess
out = subprocess.Popen(['ps', 'v', '-p', str(os.getpid())],
stdout=subprocess.PIPE).communicate()[0].split(b'\n')
vsz_index = out[0].split().index(b'RSS')
mem = float(out[1].split()[vsz_index]) / 1024
return mem

给定函数的使用给出了错误代码:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Python27\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 326, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Users\..\Desktop\Script3.py", line 10, in <module>
    memory_usage_ps()
  File "C:\Users\..\Desktop\Script3.py", line 4, in memory_usage_ps
    out = subprocess.Popen(['ps', 'v', '-p', str(os.getpid())], stdout=subprocess.PIPE).communicate()[0].split(b'\n')
  File "C:\Program Files (x86)\Python27\lib\subprocess.py", line 710, in __init__
    errread, errwrite)
  File "C:\Program Files (x86)\Python27\lib\subprocess.py", line 958, in _execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

会很感激一些建议......

2 个答案:

答案 0 :(得分:0)

问题是脚本示例是否特定于Unix。您不能在Windows中使用。您需要的是浏览Windows API以查看允许您获取进程内存使用的功能。以前已经很好地解释了如何使用Python中的Windows API,例如, How to use win32 API's with python?

您可能想要使用的Win32 API函数是GetProcessMemoryInfo:https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx

答案 1 :(得分:0)

感谢。我的新代码似乎有用......

import win32api
import os
from win32process import GetProcessMemoryInfo
from win32con import PROCESS_QUERY_INFORMATION, PROCESS_VM_READ
import win32com.client

wmi=win32com.client.GetObject('winmgmts:')
for p in wmi.InstancesOf('win32_process'):
    if p.Name == "python.exe":
        handle = win32api.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, p.Properties_('ProcessId'))
        memoryUsage = GetProcessMemoryInfo(handle)
        print memoryUsage['WorkingSetSize']