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