pythoncross-platformjythonhp-ux

Cross-platform way to get PIDs by process name in python


Several processes with the same name are running on host. What is the cross-platform way to get PIDs of those processes by name using python or jython?

  1. I want something like pidof but in python. (I don't have pidof anyway.)
  2. I can't parse /proc because it might be unavailable (on HP-UX).
  3. I do not want to run os.popen('ps') and parse the output because I think it is ugly (field sequence may be different in different OS).
  4. Target platforms are Solaris, HP-UX, and maybe others.

Solution

  • You can use psutil (https://github.com/giampaolo/psutil), which works on Windows and UNIX:

    import psutil
    
    PROCNAME = "python.exe"
    
    for proc in psutil.process_iter():
        if proc.name() == PROCNAME:
            print(proc)
    

    On my machine it prints:

    <psutil.Process(pid=3881, name='python.exe') at 140192133873040>
    

    EDIT 2017-04-27 - here's a more advanced utility function which checks the name against processes' name(), cmdline() and 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