Python изменение результатов команды powershell, которая получает использование памяти процесса

#python #powershell #psutil

#python #powershell #psutil

Вопрос:

Я создаю скрипт python (работающий в Windows), который проверяет использование памяти Java-процессом и регистрирует его. Сначала я попытался использовать psutil:

     for proc in psutil.process_iter():
        print(proc.name())
        if "java.exe" in proc.name():

            print("Process Found. Mem used: " str((proc.memory_info().rss/1024/1024)
  

Это возвращает 4095,99.. МБ каждый раз, даже если фактическое использование памяти, о котором сообщает диспетчер задач, варьируется от 8100-8400 МБ.

Затем я попробовал команду Powershell, чтобы сделать то же самое:

     powershell "Get-Process -Name java | SELECT WS"
  

где WS (рабочий набор) является ближайшим показателем к тому, что сообщается диспетчером задач. Запустив это в командном терминале, он вернул число в пределах 20 МБ от текущего использования памяти процессами. Затем я протестировал выполнение этой команды в python с использованием подпроцесса:

      process = subprocess.Popen('powershell "Get-Process -Name java | SELECT WS "',stdout=subprocess.PIPE)

     print(process.communicate()[0].strip())
  

и os.system:

     result = os.system('powershell "Get-Process -name java | SELECT WS"')
    print(result)
  

Оба возвращают одинаковое значение 4095.99.. MB psutil сделал (вплоть до последней цифры.). Итак, что-то в python изменяет способ, которым он видит, что обрабатывает память. Пробовал запускать ее у нескольких пользователей, включая администраторов и пользователя, под которым выполняется процесс, со всеми одинаковыми результатами. Я в тупике относительно того, как python может изменять вызов powershell, чтобы он возвращал другой результат, чем выполняется вне его.

Комментарии:

1. Есть ли у вас те же результаты при просмотре других процессов? Я спрашиваю, потому что я запустил ваши примеры Python и Powershell против некоторых моих процессов и получил ожидаемые результаты. Ничего не было изменено.

2. Нет. Я подозреваю, что это связано с объемом памяти, который использует процесс Java. Все остальные процессы, с которыми я тестировал, были меньше 1000 МБ ОЗУ. Мне приходит в голову, что это 32-разрядное максимальное значение для целых чисел (как psutil, так и команда powershell выводят память в байтах).

3. Это означает, что проблема с psutil может быть вызвана тем, что python не распознает, что ему нужно использовать long. Это не объясняет powershell, хотя, поскольку это возвращается обратно в python в виде строки.

4. Итак, чтобы проверить, если вы измените имя процесса на что-то, что использует менее 4 ГБ памяти, это даст правильное значение?

5. Это правильно.