web-dev-qa-db-ja.com

pythonのプロセス名でPIDを取得するクロスプラットフォームの方法

同じ名前の複数のプロセスがホストで実行されています。 pythonまたはjythonを使用して名前でそれらのプロセスのPIDを取得するクロスプラットフォームの方法は何ですか?

  1. 私はpidofのようなものが欲しいのですが、Pythonで。 (とにかくpidofを持っていません。)
  2. _/proc_を解析できません(HP-UXで使用できないため)。
  3. os.popen('ps')を実行して出力を解析したくないのは、見苦しいと思うからです(フィールドシーケンスはOSによって異なる場合があります)。
  4. ターゲットプラットフォームは、Solaris、HP-UX、およびその他のプラットフォームです。
49
Alex Bolotov

WindowsおよびUNIXで機能するpsutil( https://github.com/giampaolo/psutil )を使用できます。

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    if proc.name() == PROCNAME:
        print(proc)

私のマシンでは次のように印刷されます:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040>

EDIT 2017-04-27-これは、プロセスのname()、cmdline()、exe()に対して名前をチェックする、より高度なユーティリティ関数です。

import os
import psutil

def find_procs_by_name(name):
    "Return a list of processes matching 'name'."
    assert name, name
    ls = []
    for p in psutil.process_iter():
        name_, exe, cmdline = "", "", []
        try:
            name_ = p.name()
            cmdline = p.cmdline()
            exe = p.exe()
        except (psutil.AccessDenied, psutil.ZombieProcess):
            pass
        except psutil.NoSuchProcess:
            continue
        if name == name_ or cmdline[0] == name or os.path.basename(exe) == name:
            ls.append(name)
    return ls
69

単一のクロスプラットフォームAPIはありません。OSを確認する必要があります。 POSIXベースの場合は/ procを使用します。 Windowsの場合、次のコードを使用して、対応するプロセス名を持つすべてのPIDのリストを取得します

from win32com.client import GetObject
WMI = GetObject('winmgmts:')
processes = WMI.InstancesOf('Win32_Process')
process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]

その後、必要なプロセスを簡単に除外できます。 Win32_Processの使用可能なプロパティの詳細については、 Win32_Process Class をご覧ください。

12
Ivan
import psutil

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
  print i.name,i.pid

「YourProcess.exe」のすべてのPIDを提供します

11
baco

まず、Windows(すべての化身)は非標準のOSです。

Linux(およびほとんどの独自仕様のunixen)は、POSIX準拠の標準オペレーティングシステムです。

Cライブラリはこの二分法を反映しています。 PythonはCライブラリを反映しています。

これを行うための「クロスプラットフォーム」の方法はありません。 Windows(XPまたはVista)の特定のリリースでは、 ctypes で何かをハックする必要があります

4
S.Lott

少なくともpython自体ではありません。os.systemの解析はそうではありません。い-誰かが複数のプラットフォームに対処しなければならないのは、あなたでも他の誰かでも。

3

ThorSummonerのコメントに関するメモ

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].

DebianでPython 3を使って試しました。_proc.nameではなくproc.name()でなければなりません。

1
pchaitat

ありません、私は恐れています。プロセスは、名前ではなくpidによって一意に識別されます。本当に名前でpidを見つける必要がある場合は、提案されているようなものを使用することになりますが、移植性がなく、おそらくすべての場合に機能するとは限りません。

特定のアプリケーションのpidを見つけるだけで、このアプリケーションを制御できる場合は、スクリプトを見つけられる場所のファイルにpidを保存するようにこのアプリを変更することをお勧めします。

1
ubiyubix

Jythonの場合、Java 5を使用すると、次のようにJavaプロセスIDを取得できます。

java.lang.managementインポートから*
pid = ManagementFactory.getRuntimeMXBean()。getName()

1
ccyu