🐍

Pythonで特定のプロセスが実行中か高速で確認する方法

2024/05/27に公開

概要

Pythonで特定のプロセスが実行中かどうかを確認する方法として、

  • subprocessを使った方法
  • 検索でよく引っかかるpsutilを使った方法

の2パターンで、
例としてVRChat.exeというプロセスが実行されているか確認した際の処理時間を比較します。

環境

  • Windows10 64bit
  • Python 3.7.5

結果:subprocessを使うと速い

・検索対象であるVRChat.exeが実行中の状態。subprocessの方が3.3倍速い。

方式 処理時間[s]
subprocess使用 0.143
psutil使用 0.473

・検索対象であるVRChat.exeが実行中ではない状態。subprocessの方が6.5倍速い。

方式 処理時間[s]
subprocess使用 0.073
psutil使用 0.476

ソースコードと出力結果

subprocessを使った方法 (速い)

import time
import subprocess

# 実行中か調べたいプロセス名 + 拡張子を指定
ProcessName = "VRChat.exe"

StartTime = time.time()

# exe化した際、subprocessでコマンド実行したときにコマンドプロンプトのウインドウが表示されないように設定
StartupInfo = subprocess.STARTUPINFO()
StartupInfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW  # subprocess.SW_HIDEを使うために必要
StartupInfo.wShowWindow = subprocess.SW_HIDE

# プロセスが実行中か調べる
SendCommand = f'tasklist /nh /fi "IMAGENAME eq {ProcessName}"'  # コマンド生成
Output = subprocess.run(SendCommand, startupinfo=StartupInfo, stdout=subprocess.PIPE, shell=True, text=True)
#print(Output.stdout)   # コマンド実行結果を確認
IsProcessRunning = ProcessName in Output.stdout.split('\n')[1]

# プロセスが実行中かどうか結果表示
print("\nパターンA:")
print(f"{ProcessName}は実行中? >> {IsProcessRunning}")
print("処理時間: " + '{:.3f}'.format(time.time() - StartTime) + " 秒")

・VRChat.exeが実行中の状態の出力

パターンA:
VRChat.exeは実行中? >> True
処理時間: 0.143 秒

・VRChat.exeが実行中ではない状態の出力

パターンA:
VRChat.exeは実行中? >> False
処理時間: 0.073 秒

psutilを使った方法 (遅い)

import time
import os
import psutil   # 外部ライブラリ Version:5.9.6

# 実行中か調べたいプロセス名 + 拡張子を指定
ProcessName = "VRChat.exe"

StartTime = time.time()

# 実行中のプロセス一覧の中から、任意のプロセスがあるかひとつずつ調べる
IsProcessRunning = False
for proc in psutil.process_iter():
    try:
        if ProcessName == os.path.basename(proc.exe()):
            IsProcessRunning = True
            break   # これ以上プロセスを読み込む必要はないのでループを抜ける
    except:
            pass    # アクセス許可なしの場合など

# プロセスが実行中かどうか結果表示
print("\nパターンB:")
print(f"{ProcessName}は実行中? >> {IsProcessRunning}")
print("処理時間: " + '{:.3f}'.format(time.time() - StartTime) + " 秒")

・VRChat.exeが実行中の状態の出力

パターンB:
VRChat.exeは実行中? >> True
処理時間: 0.473 秒

・VRChat.exeが実行中ではない状態の出力

パターンB:
VRChat.exeは実行中? >> False
処理時間: 0.476 秒

注意点

chrome.exeのような名前の若いプロセス名を検索する際、そのプロセスが実行中の場合、psutilを使った方が処理時間が短くなる場合があります(psutil.process_iter()のfor文を早く抜けるため)。

参考

https://stackoverflow.com/questions/7787120/check-if-a-process-is-running-or-not-on-windows

Discussion