[python-win32] better way to get current process's name
Tim Golden
mail at timgolden.me.uk
Thu Feb 22 10:00:15 CET 2007
Kelie wrote:
> hello,
>
> is there an easier way to get the name of current process? i'm using
> wmi module from Tim Golden. here is what i have:
>
> def find_first_match(func, lst):
> """Find 1st item in a list that yield True for a give function."""
> match = None
> for i, elem in enumerate(lst):
> if func(elem):
> match = [i, elem]
> break
> return match
>
> def get_current_process_name():
> import wmi
> import win32process
> procList = wmi.WMI().Win32_Process()
> hwnd = win32process.GetCurrentProcessId()
> find = find_first_match(lambda p: int(p.Handle) == hwnd, procList)
> if find:
> return find[1].Name
> else:
> return None
>
> if __name__ == "__main__":
> print get_current_process_name()
>
> the above code works. but it is slow. it always takes a few seconds to
> get the procList. is it normal?
>
> thanks for your help
>
I'm quite sure other people can come up with non-WMI solutions,
but just a few pointers on what you have there:
If you know what you're looking for (in this case:
Win32_Process), you can avoid a certain overhead in
startup by passing find_classes=False to the WMI function:
<code>
import wmi
c = wmi.WMI (find_classes=False)
</code>
Then, you can let WMI do the heavy loading of finding
a particular process:
<code>
import win32process
import wmi
c = wmi.WMI (find_classes=False)
current_id = win32process.GetCurrentProcessId ()
for process in c.Win32_Process (Handle=current_id):
break
print process.Name
</code>
Finally, if you know you only need the name, you can
specify the list of fields to return:
<code>
import win32process
import wmi
c = wmi.WMI (find_classes=False)
current_id = win32process.GetCurrentProcessId ()
for process in c.Win32_Process (['Name'], Handle=current_id):
break
print process.Name
</code>
It's still not blindingly fast, but timeit gives...
python -m timeit "import win32process; import wmi; print wmi.WMI
(find_classes=0).Win32_Process (['Name'], Handle=win32proce
ss.GetCurrentProcessId ())[0].Name"
10 loops, best of 3: 67.9 msec per loop
... which might or might not be adequate. Depends on what
you need, and whether this is a one-shot tool or part of
some larger setup where this small startup cost will be
negligible.
TJG
More information about the Python-win32
mailing list