Хобрук: Ваш путь к мастерству в программировании

Получение использования памяти python

У меня возникли проблемы с получением данных об использовании памяти моей системой с помощью 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)

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

19.03.2020

  • Это говорит о том, что у вашего скрипта нет доступа для получения информации об этом процессе. Вы пробовали запускать свой скрипт от имени администратора/рута? 19.03.2020
  • Нет, я работаю на коде VS. 19.03.2020
  • Как я могу работать от имени администратора? 19.03.2020
  • Для Windows этот поток SO предоставляет информацию о запуске экземпляра VSCode в качестве администратора при каждом его запуске. Для однократного запуска VSCode с правами администратора щелкните правой кнопкой мыши VSCode, удерживая клавишу Shift, и выберите «Запуск от имени администратора». 19.03.2020
  • Я также предполагаю, что ни одна из основных деталей memory_info() не будет предоставить вам достаточную информацию (они не требуют повышенных привилегий). 19.03.2020
  • ничуть администрация также такое же исключение .. 19.03.2020
  • pid 0, также известный как System Idle Process, требует прав SYSTEM -- выше, чем администратор. Вы действительно хотите знать, как он использует память, или действительно хотите знать, сколько памяти использует java.exe? Смотрите мой ответ. 19.03.2020

Ответы:


1

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

В Windows 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
19.03.2020
Новые материалы

Получение стоковых обновлений с помощью Python
Для начинающего финансового аналитика Введение Описание: Этот проект Python создает скрипт для получения текущих обновлений акций с финансового веб-сайта Yahoo. Для этого проекта мы..

Это все, что вам нужно знать о Kotlin в 2022 году
Добро пожаловать! Kotlin — это язык программирования, популярность которого, кажется, растет, его действительно можно использовать для создания чего угодно, и если вы хотите узнать о Kotlin,..

Текстовый графический интерфейс с Lanterna на Java
Мой опыт работы с компьютерами (и текстовыми графическими пользовательскими интерфейсами) начался еще в восьмидесятых, когда я был ребенком, на дне рождения друга. Это был «новенький» Amstrad..

Перезарядите свой мозг: умопомрачительный потенциал мозговых компьютерных интерфейсов
Способность читать свои мысли и управлять объектами разумом долгое время были предметом человеческого любопытства, ограниченного областью научной фантастики… то есть до сих пор? С технологией,..

Основы C# — Нулевой оператор объединения (??)
Оператор ?? называется null-coalescing operator . Этот оператор используется для предоставления значения по умолчанию, если значение операнда в левой части оператора равно null ...

Сравнение номеров версий в C++ с использованием синтаксического анализа строк
Номера версий обычно используются для обозначения развития или обновлений программного обеспечения или любого другого продукта. При работе с номерами версий в C++ может быть полезно сравнить две..

В мир искусственного интеллекта…
ИИ — это новое топливо в современном мире. Куда бы вы ни обратились, с кем бы вы ни разговаривали — они, как правило, упоминают об ИИ хотя бы раз в ходе разговора. ИИ гудит повсюду. У каждого..