同じ名前の複数のプロセスがホストで実行されています。 pythonまたはjythonを使用して名前でそれらのプロセスのPIDを取得するクロスプラットフォームの方法は何ですか?
pidof
のようなものが欲しいのですが、Pythonで。 (とにかくpidof
を持っていません。)/proc
_を解析できません(HP-UXで使用できないため)。os.popen('ps')
を実行して出力を解析したくないのは、見苦しいと思うからです(フィールドシーケンスはOSによって異なる場合があります)。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
単一のクロスプラットフォーム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 をご覧ください。
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を提供します
まず、Windows(すべての化身)は非標準のOSです。
Linux(およびほとんどの独自仕様のunixen)は、POSIX準拠の標準オペレーティングシステムです。
Cライブラリはこの二分法を反映しています。 PythonはCライブラリを反映しています。
これを行うための「クロスプラットフォーム」の方法はありません。 Windows(XPまたはVista)の特定のリリースでは、 ctypes で何かをハックする必要があります
少なくともpython自体ではありません。os.systemの解析はそうではありません。い-誰かが複数のプラットフォームに対処しなければならないのは、あなたでも他の誰かでも。
process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].
DebianでPython 3を使って試しました。_proc.name
ではなくproc.name()
でなければなりません。
ありません、私は恐れています。プロセスは、名前ではなくpidによって一意に識別されます。本当に名前でpidを見つける必要がある場合は、提案されているようなものを使用することになりますが、移植性がなく、おそらくすべての場合に機能するとは限りません。
特定のアプリケーションのpidを見つけるだけで、このアプリケーションを制御できる場合は、スクリプトを見つけられる場所のファイルにpidを保存するようにこのアプリを変更することをお勧めします。
Jythonの場合、Java 5を使用すると、次のようにJavaプロセスIDを取得できます。
java.lang.managementインポートから*
pid = ManagementFactory.getRuntimeMXBean()。getName()