当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在python中通过进程名称获取PID的跨平台方法》经验,为你挑选了3个好方法。

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

    我想要像pidofpython 一样的东西.(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类



1> Giampaolo Ro..:

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



2> Ivan..:

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


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

3> baco..:
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


无论哪种方式,我都不放心。我经常听到人们大声疾呼,列表理解*总是*过滤列表的最佳方法,因为它更快。例如`process = [如果proc.name ==“ YourProcess.exe”,则psutil.process_iter()中proc的proc]]。
推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有