6

タスク マネージャーでは、python/pythonwin のプロセスしか表示されないようです。では、実行中の python スクリプトを特定するにはどうすればよいでしょうか。

4

3 に答える 3

13

このような質問に対する通常の回答は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()

于 2012-06-04T03:23:00.643 に答える
-1

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"]]
于 2017-11-01T07:30:30.360 に答える