[python] 파이썬에서 현재 CPU 및 RAM 사용량을 얻는 방법?

파이썬에서 현재 시스템 상태 (현재 CPU, RAM, 여유 디스크 공간 등)를 얻는 가장 좋은 방법은 무엇입니까? * nix 및 Windows 플랫폼의 보너스 포인트.

내 검색에서 추출하는 몇 가지 가능한 방법이 있습니다.

  1. PSI 와 같은 라이브러리 (현재 활발하게 개발되지 않았고 여러 플랫폼에서 지원되지 않는 것으로 보임) 또는 pystatgrab (2007 년 이후 활동이 없으며 Windows를 지원하지 않는 것)과 같은 라이브러리를 사용 합니다.

  2. 이러한 사용으로 플랫폼 특정 코드를 사용 os.popen("ps")* 괜찬아 시스템 및 또는 유사한 MEMORYSTATUS에서 ctypes.windll.kernel32(볼 은 ActiveState에이 제조법 Windows 플랫폼을위한 참조). 파이썬 클래스를 모든 코드 스 니펫과 함께 넣을 수 있습니다.

이러한 방법이 나쁘지는 않지만 동일한 작업을 수행하는 잘 지원되는 다중 플랫폼 방법이 있습니까?



답변

psutil 라이브러리 는 다양한 플랫폼에서 CPU, RAM 등에 대한 정보를 제공합니다.

psutil은 ps, top 및 Windows 작업 관리자와 같은 도구가 제공하는 많은 기능을 구현하여 Python을 사용하여 휴대용 방식으로 프로세스 및 시스템 활용 (CPU, 메모리) 실행 정보를 검색하기위한 인터페이스를 제공하는 모듈입니다.

현재 2.6 ~ 3.5의 Python 버전 (Python 2.4 및 2.5의 사용자는 2.1.3 버전을 사용할 수 있음)과 함께 Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD 및 NetBSD (32 비트 및 64 비트 아키텍처)를 지원합니다.


몇 가지 예 :

#!/usr/bin/env python
import psutil
# gives a single float value
psutil.cpu_percent()
# gives an object with many fields
psutil.virtual_memory()
# you can convert that object to a dictionary 
dict(psutil.virtual_memory()._asdict())
# you can have the percentage of used RAM
psutil.virtual_memory().percent
79.2
# you can calculate percentage of available memory
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
20.8

더 많은 개념과 관심 개념을 제공하는 다른 문서는 다음과 같습니다.


답변

psutil 라이브러리를 사용하십시오 . Ubuntu 18.04에서 pip는 2019 년 1 월 30 일부터 5.5.0 (최신 버전)을 설치했습니다. 이전 버전은 약간 다르게 동작 할 수 있습니다. Python에서 다음을 수행하여 psutil 버전을 확인할 수 있습니다.

from __future__ import print_function  # for Python2
import psutil
print(psutil.__versi‌​on__)

메모리 및 CPU 통계를 얻으려면 :

from __future__ import print_function
import psutil
print(psutil.cpu_percent())
print(psutil.virtual_memory())  # physical memory usage
print('memory % used:', psutil.virtual_memory()[2])

virtual_memory(튜플) 비율 메모리가 시스템 전체를 사용해야합니다. 이것은 우분투 18.04에서 몇 퍼센트 정도 과대 평가 된 것으로 보입니다.

현재 Python 인스턴스에서 사용하는 메모리를 얻을 수도 있습니다.

import os
import psutil
pid = os.getpid()
py = psutil.Process(pid)
memoryUse = py.memory_info()[0]/2.**30  # memory use in GB...I think
print('memory use:', memoryUse)

파이썬 스크립트의 현재 메모리 사용을 제공합니다.

psutil 에 대한 pypi 페이지 에는 좀 더 자세한 예제가 있습니다.


답변

Linux 만 해당 : stdlib 종속성 만있는 RAM 사용을위한 1 개의 라이너 :

import os
tot_m, used_m, free_m = map(int, os.popen('free -t -m').readlines()[-1].split()[1:])

편집 : 지정된 솔루션 OS 종속성


답변

외부 라이브러리가없는 아래 코드는 나를 위해 일했습니다. 파이썬 2.7.9에서 테스트했습니다.

CPU 사용량

import os

    CPU_Pct=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2))

    #print results
    print("CPU Usage = " + CPU_Pct)

그리고 Ram 사용량, 총계, 사용 및 무료

import os
mem=str(os.popen('free -t -m').readlines())
"""
Get a whole line of memory output, it will be something like below
['             total       used       free     shared    buffers     cached\n',
'Mem:           925        591        334         14         30        355\n',
'-/+ buffers/cache:        205        719\n',
'Swap:           99          0         99\n',
'Total:        1025        591        434\n']
 So, we need total memory, usage and free memory.
 We should find the index of capital T which is unique at this string
"""
T_ind=mem.index('T')
"""
Than, we can recreate the string with this information. After T we have,
"Total:        " which has 14 characters, so we can start from index of T +14
and last 4 characters are also not necessary.
We can create a new sub-string using this information
"""
mem_G=mem[T_ind+14:-4]
"""
The result will be like
1025        603        422
we need to find first index of the first space, and we can start our substring
from from 0 to this index number, this will give us the string of total memory
"""
S1_ind=mem_G.index(' ')
mem_T=mem_G[0:S1_ind]
"""
Similarly we will create a new sub-string, which will start at the second value.
The resulting string will be like
603        422
Again, we should find the index of first space and than the
take the Used Memory and Free memory.
"""
mem_G1=mem_G[S1_ind+8:]
S2_ind=mem_G1.index(' ')
mem_U=mem_G1[0:S2_ind]

mem_F=mem_G1[S2_ind+8:]
print 'Summary = ' + mem_G
print 'Total Memory = ' + mem_T +' MB'
print 'Used Memory = ' + mem_U +' MB'
print 'Free Memory = ' + mem_F +' MB'


답변

여기 제가 얼마 전에 정리 한 것이 있습니다. 창문 일 뿐이지 만 필요한 일에 참여하는 데 도움이 될 수 있습니다.

“sys available mem”에서 파생 됨 :
http://msdn2.microsoft.com/en-us/library/aa455130.aspx

“개별 프로세스 정보 및 Python 스크립트 예”
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

참고 : WMI 인터페이스 / 프로세스도 비슷한 작업을 수행 할 수 있습니다. 현재 방법이 내 요구를 충족시키기 때문에 여기에서 사용하지 않지만 언젠가 이것을 확장하거나 개선 해야하는 경우 WMI 도구를 조사 할 수 있습니다 .

파이썬 WMI :

http://tgolden.sc.sabren.com/python/wmi.html

코드:

'''
Monitor window processes

derived from:
>for sys available mem
http://msdn2.microsoft.com/en-us/library/aa455130.aspx

> individual process information and python script examples
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

NOTE: the WMI interface/process is also available for performing similar tasks
        I'm not using it here because the current method covers my needs, but if someday it's needed
        to extend or improve this module, then may want to investigate the WMI tools available.
        WMI for python:
        http://tgolden.sc.sabren.com/python/wmi.html
'''

__revision__ = 3

import win32com.client
from ctypes import *
from ctypes.wintypes import *
import pythoncom
import pywintypes
import datetime


class MEMORYSTATUS(Structure):
    _fields_ = [
                ('dwLength', DWORD),
                ('dwMemoryLoad', DWORD),
                ('dwTotalPhys', DWORD),
                ('dwAvailPhys', DWORD),
                ('dwTotalPageFile', DWORD),
                ('dwAvailPageFile', DWORD),
                ('dwTotalVirtual', DWORD),
                ('dwAvailVirtual', DWORD),
                ]


def winmem():
    x = MEMORYSTATUS() # create the structure
    windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes
    return x


class process_stats:
    '''process_stats is able to provide counters of (all?) the items available in perfmon.
    Refer to the self.supported_types keys for the currently supported 'Performance Objects'

    To add logging support for other data you can derive the necessary data from perfmon:
    ---------
    perfmon can be run from windows 'run' menu by entering 'perfmon' and enter.
    Clicking on the '+' will open the 'add counters' menu,
    From the 'Add Counters' dialog, the 'Performance object' is the self.support_types key.
    --> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent)
    For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary,
    keyed by the 'Performance Object' name as mentioned above.
    ---------

    NOTE: The 'NETFramework_NETCLRMemory' key does not seem to log dotnet 2.0 properly.

    Initially the python implementation was derived from:
    http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
    '''
    def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]):
        '''process_names_list == the list of all processes to log (if empty log all)
        perf_object_list == list of process counters to log
        filter_list == list of text to filter
        print_results == boolean, output to stdout
        '''
        pythoncom.CoInitialize() # Needed when run by the same process in a thread

        self.process_name_list = process_name_list
        self.perf_object_list = perf_object_list
        self.filter_list = filter_list

        self.win32_perf_base = 'Win32_PerfFormattedData_'

        # Define new datatypes here!
        self.supported_types = {
                                    'NETFramework_NETCLRMemory':    [
                                                                        'Name',
                                                                        'NumberTotalCommittedBytes',
                                                                        'NumberTotalReservedBytes',
                                                                        'NumberInducedGC',
                                                                        'NumberGen0Collections',
                                                                        'NumberGen1Collections',
                                                                        'NumberGen2Collections',
                                                                        'PromotedMemoryFromGen0',
                                                                        'PromotedMemoryFromGen1',
                                                                        'PercentTimeInGC',
                                                                        'LargeObjectHeapSize'
                                                                     ],

                                    'PerfProc_Process':              [
                                                                          'Name',
                                                                          'PrivateBytes',
                                                                          'ElapsedTime',
                                                                          'IDProcess',# pid
                                                                          'Caption',
                                                                          'CreatingProcessID',
                                                                          'Description',
                                                                          'IODataBytesPersec',
                                                                          'IODataOperationsPersec',
                                                                          'IOOtherBytesPersec',
                                                                          'IOOtherOperationsPersec',
                                                                          'IOReadBytesPersec',
                                                                          'IOReadOperationsPersec',
                                                                          'IOWriteBytesPersec',
                                                                          'IOWriteOperationsPersec'
                                                                      ]
                                }

    def get_pid_stats(self, pid):
        this_proc_dict = {}

        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread        

            if len(colItems) > 0:
                for objItem in colItems:
                    if hasattr(objItem, 'IDProcess') and pid == objItem.IDProcess:

                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            break

        return this_proc_dict


    def get_stats(self):
        '''
        Show process stats for all processes in given list, if none given return all processes
        If filter list is defined return only the items that match or contained in the list
        Returns a list of result dictionaries
        '''
        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        proc_results_list = []
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread

            try:
                if len(colItems) > 0:
                    for objItem in colItems:
                        found_flag = False
                        this_proc_dict = {}

                        if not self.process_name_list:
                            found_flag = True
                        else:
                            # Check if process name is in the process name list, allow print if it is
                            for proc_name in self.process_name_list:
                                obj_name = objItem.Name
                                if proc_name.lower() in obj_name.lower(): # will log if contains name
                                    found_flag = True
                                    break

                        if found_flag:
                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            proc_results_list.append(this_proc_dict)

            except pywintypes.com_error, err_msg:
                # Ignore and continue (proc_mem_logger calls this function once per second)
                continue
        return proc_results_list


def get_sys_stats():
    ''' Returns a dictionary of the system stats'''
    pythoncom.CoInitialize() # Needed when run by the same process in a thread
    x = winmem()

    sys_dict = {
                    'dwAvailPhys': x.dwAvailPhys,
                    'dwAvailVirtual':x.dwAvailVirtual
                }
    return sys_dict


if __name__ == '__main__':
    # This area used for testing only
    sys_dict = get_sys_stats()

    stats_processor = process_stats(process_name_list=['process2watch'],perf_object_list=[],filter_list=[])
    proc_results = stats_processor.get_stats()

    for result_dict in proc_results:
        print result_dict

    import os
    this_pid = os.getpid()
    this_proc_results = stats_processor.get_pid_stats(this_pid)

    print 'this proc results:'
    print this_proc_results

http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python


답변

우리는 여유 메모리에서 순간적인 변동을 발견 할 수 있고 meminfo 데이터 소스를 쿼리하는 것이 도움이되었다고 느꼈기 때문에 일반적인 정보 소스를 사용하기로 선택했습니다 . 또한 사전 분석 된 몇 가지 관련 매개 변수를 얻는 데 도움이되었습니다.

암호

import os

linux_filepath = "/proc/meminfo"
meminfo = dict(
    (i.split()[0].rstrip(":"), int(i.split()[1]))
    for i in open(linux_filepath).readlines()
)
meminfo["memory_total_gb"] = meminfo["MemTotal"] / (2 ** 20)
meminfo["memory_free_gb"] = meminfo["MemFree"] / (2 ** 20)
meminfo["memory_available_gb"] = meminfo["MemAvailable"] / (2 ** 20)

참조 출력 (추가 분석을 위해 모든 줄 바꿈 제거)

MemTotal : 1014500 kB MemFree : 562680 kB 사용 가능 : 646364 kB 버퍼 : 15144 kB 캐시 됨 : 210720 kB 스왑 캐시 : 0 kB 활성 : 261476 kB 비활성 : 128888 kB 활성 (anon) : 167092 kB 비활성 (anon) : 20888 kB 활성 (파일) : 94384 kB 비활성 (파일) : 108000 kB 제거 불가 : 3652 kB Mlocked : 3652 kB SwapTotal : 0 kB SwapFree : 0 kB Dirty : 0 kB Writeback : 0 kB AnonPages : 168160 kB 매핑 됨 : 81352 kB Shmem : 21060 kB 슬래브 : 34492 kB Sreclaimable : 18044 kB SUnreclaim : 16448 kB KernelStack : 2672 kB PageTables : 8180 kB NFS_Unstable : 0 kB Bounce : 0 kB WritebackTmp : 0 kB CommitLimit : 507248 kB Committed_AS : 1038756 kB VmallocTotal : 34359738367 kB Vumloc 사용 : 하드웨어 : 0 kB AnonHuge 페이지 : 88064 kB CmaTotal : 0 kB CmaFree : 0 kB HugePages_Total : 0 HugePages_Free : 0 HugePages_Rsvd : 0 HugePages_Surp : 0 Hugepages 크기 :2048 kB DirectMap4k : 43008 kB DirectMap2M : 1005568 kB


답변

이 답변은 Python 2 용으로 작성된 것 같으며 어떤 경우에도 resourcePython 3에서 사용할 수 있는 표준 패키지에 대해 언급 한 사람이 없습니다 . 주어진 프로세스 (기본적으로 Python 프로세스 호출) 의 리소스 제한 을 얻는 명령을 제공합니다 . 이것은 시스템이 전체 리소스를 현재 사용 하는 것과 동일하지 않지만 “이 스크립트에는 X 개의 RAM 만 사용하고 싶습니다”와 같은 동일한 문제를 해결할 수 있습니다.