在Python中通过进程名获得PID的跨平台方式

在主机上运行多个具有相同名称的进程。 什么是使用pythonjython按名称获取这些进程的PID的跨平台方法?

  1. 我想要的东西像pidof但在Python中。 (无论如何,我也没有任何pidof
  2. 我无法parsing/proc因为它可能不可用(在HP-UX上)。
  3. 我不想运行os.popen('ps')并parsing输出,因为我觉得它很丑(在不同的操作系统中,字段顺序可能不同)。
  4. 目标平台是Solaris,HP-UX和其他可能的平台。

您可以使用psutil( https://github.com/giampaolo/psutil ),它适用于Windows和UNIX:

 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> 

编辑2017-04-27 – 这里是一个更先进的实用function,它检查进程名称(),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] 

然后,您可以轻松过滤出您需要的stream程。 有关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”

我不认为你将能够find一个纯粹的基于python的,可移植的解决scheme,而不使用/ proc或命令行工具,至less不在python本身。 parsingos.system并不难看 – 有人必须处理多个平台,无论是你还是其他人。 对于你感兴趣的操作系统来说,实现它应该相当简单,诚实。

首先,Windows(所有它的化身)是一个非标准的操作系统。

Linux(以及大多数专有unixen)是符合POSIX标准的操作系统。

C库反映了这种二分法。 Python反映了C库。

没有“跨平台”的方式来做到这一点。 你必须破解一些与ctypes的特定版本的Windows(XP或Vista)

没有,我害怕。 进程是由pid而不是名称唯一标识。 如果你真的必须find一个名称的pid,那么你会使用像你所build议的东西,但它不会是可移植的,可能不会在所有情况下工作。

如果你只需要find一个特定的应用程序的pid,并且你可以控制这个应用程序,那么我build议你改变这个应用程序把它的pid存储在脚本可以find它的某个位置的文件中。

对于jython,如果使用Java 5,则可以获得Java进程ID,如下所示:

来自java.lang.management import *
pid = ManagementFactory.getRuntimeMXBean()。getName()

关于ThorSummoner的评论

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

我已经在Debian上用Python 3试了一下,我认为它必须是proc.name()而不是proc.name