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

python中通过进程名获取PID的跨平台方法,python,cross-platform,jython,hp-ux,Python,Cross Platform,Jython,Hp Ux,主机上正在运行多个同名进程。使用python或jython按名称获取这些进程的PID的跨平台方式是什么 我想要类似于pidof的东西,但是用python。(反正我没有pidof) 我无法解析/proc,因为它可能不可用(在HP-UX上) 我不想运行os.popen('ps')并解析输出,因为我认为它很难看(不同操作系统中的字段序列可能不同) 目标平台是Solaris、HP-UX,可能还有其他平台 我认为,如果不使用/proc或命令行实用程序,您将无法找到一个纯粹基于python的可移植解决方案,

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

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

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

    首先,Windows(在所有版本中)是一个非标准操作系统

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

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


    没有“跨平台”的方法可以做到这一点。你必须为特定版本的Windows(XP或Vista)准备一些东西。恐怕没有。进程由pid而不是名称唯一标识。如果您真的必须按名称查找pid,那么您将使用您建议的东西,但它不会是可移植的,并且可能不会在所有情况下都起作用


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

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

    从java.lang.management导入*

    pid=ManagementFactory.getRuntimeMXBean().getName()

    没有单一的跨平台API,您必须检查操作系统。用于基于posix的使用/过程。对于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_进程可用属性的更多信息,请查看

    您可以使用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>
    
    在“YourProcess.exe”的所有PID上做一个注释


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

    才有效,但我想得到另一个进程的PID(像pidof,但不使用pidof),不幸的是OS X不允许您访问进程的许多属性(名称、exe、cmdline),即使您只尝试访问由您创建的流程。除非您使用sudo运行解释器/脚本,那就是。是的,这是OSX的一个限制(它是唯一一个这样运行的平台)。除了使用sudo/setuid.Update之外,您什么也做不了,这对于不同的方法来说都是固定的,请参阅:在我的环境中
    。name
    是一个方法,而不是属性。那么这将如何从多个python进程中识别我的进程呢?这个库不是python的标准库,至少不是2.7。没有检查其他版本。@ZoranPavlovic是的,它是包含构建的
    pywin32
    包,答案应该包括这个,我不持有任何股份;我经常听到人们抱怨列表理解总是筛选列表的最佳方式,因为它更快。例如
    process=[proc for proc in psutil.process\u iter()如果proc.name==“YourProcess.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
    
    import psutil
    
    process = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())
    for i in process:
      print i.name,i.pid
    
    process = [proc for proc in psutil.process_iter() if proc.name == "YourProcess.exe"].