Python:実行中のすべてのプロセスのリストとメモリ使用量を取得

システム内で実行中のすべてのプロセスのリストを取得し、メモリ使用量で並べ替えるクロスプラットフォームの方法について説明します。

psutil Pythonライブラリのインストール方法

pipを使用してpsutilをインストールするには、次のコマンドを実行します。

pip install psutil

psutilは、実行中のすべてのプロセスを反復処理する機能を提供します。

for proc in psutil.process_iter():
   try:
      # Get process name & pid from process object.
      processName = proc.name()
      processID = proc.pid
      print(processName, ' - ', processID)
   except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
      pass

chrome.exe  –  14008

chrome.exe  –  14340

ShellExperienceHost.exe  –  14368

python.exe  –  14372

chrome.exe  –  14616

python.exe  –  14628

process_iter()によって生成された各プロセスオブジェクトには、ID、名前、ユーザー名、親ID、メモリ使用量、CPU使用量など、実行中のプロセスに関する情報があります。

プロセスオブジェクトは、プロセスの詳細を辞書として取得する機能も提供します。

as_dict(attrs=None, ad_value=None)

dictとして渡されたプロセス属性の値を返します。すなわち

pInfoDict = processObj.as_dict(attrs=['pid', 'name', 'cpu_percent'])

実行中の各プロセスのプロセスオブジェクトでこの関数を使用して、辞書のリストを生成します。

import psutil
listOfProcessNames = list()
# Iterate over all running processes
for proc in psutil.process_iter():
   # Get process detail as dictionary
   pInfoDict = proc.as_dict(attrs=['pid', 'name', 'cpu_percent'])
   # Append dict of process detail in list
   listOfProcessNames.append(pInfoDict)

リストlistOfProcessNamesの内容は次のとおりです。

{'cpu_percent': 0.0, 'pid': 120, 'name': 'Registry'}

{'cpu_percent': 0.0, 'pid': 420, 'name': 'svchost.exe'}

{'cpu_percent': 0.0, 'pid': 448, 'name': 'smss.exe'}

{'cpu_percent': 0.0, 'pid': 488, 'name': 'notepad.exe'}

{'cpu_percent': 0.0, 'pid': 520, 'name': 'WUDFHost.exe'}

as_dict()のような他の重要な属性も渡すことができます。

'pid', 'memory_percent', 'name', 'cpu_times', 'create_time', 'memory_info'

ライブラリのドキュメントで属性を確認してください。

メモリ使用量でソートされた実行中のすべてのプロセスのリストを取得します

import psutil

def getListOfProcessSortedByMemory():
    '''
    Get list of running process sorted by Memory Usage
    '''
    listOfProcObjects = []
    # Iterate over the list
    for proc in psutil.process_iter():
       try:
           # Fetch process details as dict
           pinfo = proc.as_dict(attrs=['pid', 'name', 'username'])
           pinfo['vms'] = proc.memory_info().vms / (1024 * 1024)
           # Append dict to list
           listOfProcObjects.append(pinfo);
       except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
           pass
    # Sort list of dict by key vms i.e. memory usage
    listOfProcObjects = sorted(listOfProcObjects, key=lambda procObj: procObj['vms'], reverse=True)
    return listOfProcObjects

実行中のすべてのプロセスのリストを反復処理し、IDおよび名前とともにdictとしてメモリ使用量を取得します。

プロセスクラスは、プロセスのメモリ情報を提供し、そこから仮想メモリの使用量を取得してから、各プロセスの辞書をリストに追加します。最後に、キーvmsで辞書のリストをソートします。そのため、プロセスのリストはメモリ使用量でソートされます。

この関数を呼び出して、メモリ使用量ごとに上位5つのプロセスを出力しましょう。

listOfRunningProcess = getListOfProcessSortedByMemory()

for elem in listOfRunningProcess[:5] :
    print(elem)

出力:

{'name': 'pycharm64.exe', 'username': 'varun', 'pid': 2092, 'vms': 662.62109375}
{'name': 'chrome.exe', 'username': 'varun', 'pid': 4276, 'vms': 230.421875}
{'name': 'SearchUI.exe', 'username': 'varun', 'pid': 11996, 'vms': 94.2890625}
{'name': 'chrome.exe', 'username': 'varun', 'pid': 2604, 'vms': 89.8828125}
{'name': 'chrome.exe', 'username': 'varun', 'pid': 9616, 'vms': 83.5546875}

完全なコードは次のとおり

import psutil
def getListOfProcessSortedByMemory():
    '''
    Get list of running process sorted by Memory Usage
    '''
    listOfProcObjects = []
    # Iterate over the list
    for proc in psutil.process_iter():
       try:
           # Fetch process details as dict
           pinfo = proc.as_dict(attrs=['pid', 'name', 'username'])
           pinfo['vms'] = proc.memory_info().vms / (1024 * 1024)
           # Append dict to list
           listOfProcObjects.append(pinfo);
       except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
           pass
    # Sort list of dict by key vms i.e. memory usage
    listOfProcObjects = sorted(listOfProcObjects, key=lambda procObj: procObj['vms'], reverse=True)
    return listOfProcObjects
def main():
    print("*** Iterate over all running process and print process ID & Name ***")
    # Iterate over all running process
    for proc in psutil.process_iter():
        try:
            # Get process name & pid from process object.
            processName = proc.name()
            processID = proc.pid
            print(processName , ' ::: ', processID)
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    print('*** Create a list of all running processes ***')
    listOfProcessNames = list()
    # Iterate over all running processes
    for proc in psutil.process_iter():
       # Get process detail as dictionary
       pInfoDict = proc.as_dict(attrs=['pid', 'name', 'cpu_percent'])
       # Append dict of process detail in list
       listOfProcessNames.append(pInfoDict)
    # Iterate over the list of dictionary and print each elem
    for elem in listOfProcessNames:
        print(elem)
    print('*** Top 5 process with highest memory usage ***')
    listOfRunningProcess = getListOfProcessSortedByMemory()
    for elem in listOfRunningProcess[:5] :
        print(elem)
if __name__ == '__main__':
   main()

コメントを残す

メールアドレスが公開されることはありません。

Next Post

PyQt5チュートリアル — PythonでGUIアプリの構築

日 7月 8 , 2018
PyQt5チュートリアル — PythonでGUIアプリの構築