Я создаю скрипт на 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 МБ psutil (вплоть до последней цифры.). Так что что-то в питоне изменяет способ, которым он видит, который обрабатывает память. Попытался запустить его на нескольких пользователях, включая пользователей с правами администратора и пользователя, на котором запущен процесс с одинаковыми результатами. Я озадачен тем, как python мог изменять вызов powershell, чтобы он возвращал результат, отличный от того, который выполняется вне его.