57

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

  1. 我想要类似pidof但在python中的东西。pidof(反正我没有。)
  2. 我无法解析/proc,因为它可能不可用(在 HP-UX 上)。
  3. 我不想运行os.popen('ps')和解析输出,因为我认为它很难看(不同操作系统中的字段顺序可能不同)。
  4. 目标平台是 Solaris、HP-UX,也许还有其他。
4

9 回答 9

81

您可以使用适用于 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>

编辑 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(p)
    return ls
于 2010-02-10T23:12:17.287 回答
14

没有单一的跨平台 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 类

于 2009-08-04T10:00:18.143 回答
11
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

于 2013-02-09T23:42:35.907 回答
5

关于ThorSummoner 评论的注释

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

我已经在 Debian 上使用 Python 3 进行了尝试,我认为它必须proc.name()代替proc.name.

于 2017-04-15T11:50:43.013 回答
3

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

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

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

没有“跨平台”的方法可以做到这一点。您必须使用ctypes为特定版本的 Windows(XP 或 Vista)破解一些东西

于 2009-02-15T12:43:05.520 回答
1

我认为如果不使用 /proc 或命令行实用程序,您将无法找到纯粹基于 python 的可移植解决方案,至少在 python 本身中不会。解析 os.system 并不难看——有人必须处理多个平台,无论是你还是其他人。老实说,为您感兴趣的操作系统实现它应该相当容易。

于 2009-02-15T10:35:56.793 回答
0

没有,恐怕。进程由 pid 而不是名称唯一标识。如果您真的必须按名称查找 pid,那么您将使用您建议的东西,但它不是可移植的,并且可能无法在所有情况下工作。

如果您只需要查找某个应用程序的 pid 并且您可以控制此应用程序,那么我建议更改此应用程序以将其 pid 存储在脚本可以找到它的某个位置的文件中。

于 2009-02-17T14:21:30.213 回答
0

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

从 java.lang.management 导入 *
pid = ManagementFactory.getRuntimeMXBean().getName()

于 2009-04-07T18:30:37.703 回答
0

只需使用:

def get_process_by_name(name):
    import re, psutil
    ls = list()
    for p in psutil.process_iter():
        if hasattr(p, 'name'):
            if re.match(".*" + name + ".*", p.name()):
                ls.append(p)
    return ls

返回进程对象

于 2021-07-07T07:36:19.537 回答