在python中通过进程名称获取PID的跨平台方法

时间:2009-02-15 10:23:56

标签: python cross-platform jython hp-ux

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

  1. 我想要pidof之类的内容,但是在python中。 (无论如何,我没有pidof。)
  2. 我无法解析/proc,因为它可能不可用(在HP-UX上)。
  3. 我不想运行os.popen('ps')并解析输出,因为我认为它很难看(不同操作系统中的字段顺序可能不同)。
  4. 目标平台是Solaris,HP-UX以及其他平台。

9 个答案:

答案 0 :(得分:69)

您可以使用适用于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 - 这是一个更高级的实用程序函数,它根据进程的名称(),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

答案 1 :(得分: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 Class

答案 2 :(得分:9)

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

答案 3 :(得分:4)

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

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

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

没有“跨平台”的方式来做到这一点。对于特定版本的Windows(XP或Vista),您必须使用ctypes进行攻击

答案 4 :(得分:3)

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

答案 5 :(得分:1)

没有,我害怕。进程由pid唯一标识,而不是名称。如果你真的必须找到一个名字的pid,那么你将使用你所建议的东西,但它不会是可移植的,并且可能不适用于所有情况。

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

答案 6 :(得分:1)

对于jython,如果使用Java 5,那么您可以获得以下Java进程ID:

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

答案 7 :(得分:1)

关于ThorSummoner's comment

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

我在使用Python 3的Debian上试过它,我认为它必须是proc.name()而不是proc.name

答案 8 :(得分: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

返回进程对象