Получение использования памяти python - PullRequest
0 голосов
/ 19 марта 2020

У меня возникают проблемы с восстановлением использования памяти моей системы с использованием psutil.

Когда я запускаю свой код, он корректно извлекает использование процессора, но при попытке получить память выдает ошибку AccessDenied.

код:

if(pi['name']=='java.exe'):
    pro=psutil.Process(0)
    cpu=pro.cpu_percent(1)
    memory=pro.memory_full_info().uss/(1024*1024)
    return memory,cpu

Сообщение об ошибке:

psutil.AccessDenied (pid=0)

Как я могу получить использование памяти?

1 Ответ

0 голосов
/ 19 марта 2020

psutil.Process() принимает один аргумент - идентификатор процесса (PID). Если он вызывается без аргумента или с None, то используется pid текущего процесса.

В окне pid 0 - это Процесс простоя системы , для которого требуется SYSTEM привилегий.

pro=psutil.Process(0) # here's your problem

Если вы хотите получить использование памяти / процессора java.exe, вам нужно будет получить pid, затем используйте psutil. В приведенном ниже примере я использовал firefox.exe:

import psutil
from ctypes import *
from ctypes.wintypes import *

class PROCESSENTRY32W(Structure):
    _fields_ = [("dwSize", DWORD),
                ("cntUsage", DWORD),
                ("th32ProcessID", DWORD),
                ("th32DefaultHeapID", POINTER(ULONG)),
                ("th32ModuleID", DWORD),
                ("cntThreads", DWORD),
                ("th32ParentProcessID", DWORD),
                ("pcPriClassBase", LONG),
                ("dwFlags", DWORD),
                ("szExeFile", c_wchar * MAX_PATH)]

def get_processes():
    TH32CS_SNAPPROCESS = 0x00000002
    INVALID_HANDLE_VALUE = -1

    CreateToolhelp32Snapshot = windll.kernel32.CreateToolhelp32Snapshot
    CreateToolhelp32Snapshot.argtypes = [DWORD, DWORD]
    CreateToolhelp32Snapshot.restype = HANDLE

    Process32FirstW = windll.kernel32.Process32FirstW
    Process32FirstW.argtypes = [HANDLE, POINTER(PROCESSENTRY32W)]
    Process32FirstW.restype = BOOL

    Process32NextW = windll.kernel32.Process32NextW
    Process32NextW.argtypes = [HANDLE, POINTER(PROCESSENTRY32W)]
    Process32NextW.restype = BOOL

    CloseHandle = windll.kernel32.CloseHandle
    CloseHandle.argtypes = [HANDLE]
    CloseHandle.restype = BOOL

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    if snapshot == INVALID_HANDLE_VALUE:
        return []

    try:
        process_entry = PROCESSENTRY32W()
        process_entry.dwSize = sizeof(PROCESSENTRY32W)
        if not Process32FirstW(snapshot, byref(process_entry)):
            return []

        processes = []
        while Process32NextW(snapshot, byref(process_entry)):
            processes.append((process_entry.th32ProcessID, process_entry.szExeFile))
    finally:
        CloseHandle(snapshot)
        #print("Closed handle")

    return processes

for pid, name in get_processes():
    if name == "firefox.exe":
        pro = psutil.Process(pid)
        cpu = pro.cpu_percent(1.0)
        memory = pro.memory_full_info().uss/(1024*1024)
        print(memory, cpu)

Вывод:

471.2890625 1.6
127.15234375 25.0
18.50390625 0.0
668.09375 0.0
706.6875 0.0
512.671875 0.0
648.953125 4.7
1037.0859375 4.7
1160.1015625 98.4
337.46484375 0.0
1418.72265625 1.6
0.90625 0.0
0.90625 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...