views:

1989

answers:

6

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

  1. It's 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.
+3  A: 

I don't think you will be able to find a purely python-based, portable solution without using /proc or command line utilities, at least not in python itself. Parsing os.system is not ugly - someone has to deal with the multiple platforms, be it you or someone else. Implementing it for the OS you are interested in should be fairly easy, honestly.

David Cournapeau
+3  A: 

First, Windows (in all it's incarnations) is a non-standard OS.

Linux (and most proprietary unixen) are POSIX-compliant standard operating systems.

The C libraries reflect this dichotomy. Python reflects the C libraries.

There is no "cross-platform" way to do this. You have to hack up something with ctypes for a particular release of Windows (XP or Vista)

S.Lott
+1  A: 

There isn't, I'm afraid. Processes are uniquely identified by pid not by name. If you really must find a pid by name, then you will have use something like you have suggested, but it won't be portable and probably will not work in all cases.

If you only have to find the pids for a certain application and you have control over this application, then I'd suggest changing this app to store its pid in files in some location where your script can find it.

bromfiets
+1  A: 

For jython, if Java 5 is used, then you can get the Java process id as following:

from java.lang.management import *
pid = ManagementFactory.getRuntimeMXBean().getName()

ccyu
that works, but I want to get PID of another process (like pidof do but without using pidof)
Oleksandr Bolotov
+2  A: 

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 GetObject
WMI = 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

Ivan
+5  A: 

You can use psutil (http://code.google.com/p/psutil) which works on Windows and UNIX:

import psutil

PROCNAME = "python.exe"

for proc in psutil.process_iter():
    if proc.name == PROCNAME:
        print proc

The code above on my machines prints:

psutil.Process (PID:2908; PPID:3944; NAME:'python.exe'; PATH:'C:\Python26'; CMDL
INE:['C:\\Python26\\python.exe', 'D:\\pyftpdlib\\svn\\psutil\\foo.py']; UID:-1;
GID:-1;)
Giampaolo Rodolà
You´ve made very useful module. Thank you.
Oleksandr Bolotov