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

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


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

import psutilPROCNAME = "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 osimport psutildef 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


There's no single cross-platform API, you'll have to check for OS. For posix based use /proc. For Windows use following code to get list of all pids with coresponding process names

from win32com.client import GetObjectWMI = GetObject('winmgmts:')processes = WMI.InstancesOf('Win32_Process')process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes]

You can then easily filter out processes you need.For more info on available properties of Win32_Process check out Win32_Process Class


import psutilprocess = filter(lambda p: p.name() == "YourProcess.exe", psutil.process_iter())for i in process:  print i.name,i.pid

Give all pids of "YourProcess.exe"