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

Ale*_*tov 50 python cross-platform jython hp-ux

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

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

Gia*_*olà 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)
Run Code Online (Sandbox Code Playgroud)

在我的机器上打印:

<psutil.Process(pid=3881, name='python.exe') at 140192133873040>
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)


Iva*_*van 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]
Run Code Online (Sandbox Code Playgroud)

然后,您可以轻松过滤出所需的流程.有关Win32_Process的可用属性的更多信息,请查看Win32_Process类

  • @ZoranPavlovic是的,它是带有构建http://sourceforge.net/projects/pywin32/files/pywin32/的`pywin32`软件包,答案应该包含此内容 (2认同)

bac*_*aco 10

import psutil

process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
for i in process:
  print i.name,i.pid
Run Code Online (Sandbox Code Playgroud)

提供所有"YourProcess.exe"的pid

  • 无论哪种方式,我都不放心。我经常听到人们大声疾呼,列表理解*总是*过滤列表的最佳方法,因为它更快。例如`process = [如果proc.name ==“ YourProcess.exe”,则psutil.process_iter()中proc的proc]]。 (3认同)

小智 5

关于ThorSummoner 评论的说明

process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].
Run Code Online (Sandbox Code Playgroud)

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