タスク マネージャーでは、python/pythonwin のプロセスしか表示されないようです。では、実行中の python スクリプトを特定するにはどうすればよいでしょうか。
3 に答える
このような質問に対する通常の回答はProcess Explorerです。python.exe
またはのインスタンスの完全なコマンド ラインをpythonw.exe
ツールチップで確認できます。
Python で同じ情報を取得するには、psutil モジュールを使用できます。
import psutil
pythons = [[" ".join(p.cmdline), p.pid] for p in psutil.process_iter()
if p.name.lower() in ("python.exe", "pythonw.exe")]
結果 はpythons
、Python プロセスを表すリストのリストです。各リストの最初の項目は、オプションを含む、プロセスを開始したコマンド ラインです。2 番目の項目はプロセス ID です。
psutilProcess
クラスには他にも多くのものが含まれているため、それらすべてが必要な場合は、代わりに次のようにすることができます。
pythons = [p for p in psutil.process_iter() if p.name.lower() in ("python.exe", "pythonw.exe")]
現在、私のシステムでは、すべてのプロセスを繰り返すのにpsutil.process_iter()
数秒かかりますが、これはばかげているように思えます。以下は、Python が認識する前にプロセス フィルタリングを行うため、大幅に高速ですが、wmic
コマンド ライン ツールに依存しており、Windows のすべてのバージョンにあるわけではありません (特に、XP Home にはありません)。ここでの結果は、最初のpsutil
バージョンと同じです (リストのリストで、それぞれに 1 つの Python プロセスのコマンド ラインとプロセス ID が含まれています)。
import subprocess
wmic_cmd = """wmic process where "name='python.exe' or name='pythonw.exe'" get commandline,processid"""
wmic_prc = subprocess.Popen(wmic_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
wmic_out, wmic_err = wmic_prc.communicate()
pythons = [item.rsplit(None, 1) for item in wmic_out.splitlines() if item][1:]
pythons = [[cmdline, int(pid)] for [cmdline, pid] in pythons]
が利用できない場合wmic
は、空のリストが表示され[]
ます。少なくとも 1 つの Python プロセス (自分のプロセス) があることがわかっているので、これをエラーとしてトラップし、適切なメッセージを表示できます。
独自のプロセス ID を取得して、たとえばプロセスの強制終了を開始する場合に考慮から除外できるようにするには、pywin32 を試してください。win32process.GetCurrentProcessID()
Python 3 の場合:
import psutil
pythons = [[" ".join(p.cmdline()), p.pid] for p in psutil.process_iter()
if p.name().lower() in ["python.exe", "pythonw.exe"]]