在主机上运行多个具有相同名称的进程.使用python或jython通过名称获取这些进程的PID的跨平台方法是什么?
我想要像pidof
python 一样的东西.(pidof
反正我也没有.)
我无法解析,/proc
因为它可能不可用(在HP-UX上).
我不想运行os.popen('ps')
和解析输出,因为我觉得它很难看(字段顺序可能在不同的操作系统中有所不同).
目标平台是Solaris,HP-UX和其他平台.
Giampaolo Ro.. 71
您可以使用适用于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)
在我的机器上打印:
编辑2017-04-27 - 这是一个更高级的实用程序函数,它根据进程的名称(),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
Ivan.. 12
没有单一的跨平台API,您必须检查操作系统.对于基于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类
您可以使用适用于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)
在我的机器上打印:
编辑2017-04-27 - 这是一个更高级的实用程序函数,它根据进程的名称(),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,您必须检查操作系统.对于基于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类
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