Terminating processes on Windows (handles and IDs)

G

geoffbache

Hi all,

I've always wondered why os.kill isn't supported on Windows. I found a
discussion somewhere from 2006 about this so it seems others have
wanted it, but still nothing. So I have a half-baked solution
involving calling "taskkill" on Windows Vista or "tskill" on Windows
XP via the shell. I feel there has to be a better way.

I'm also fairly confused about when I've got an ID and when I've got a
handle. The subprocess module gives me IDs which the above programs
accept, but other ways of spawning processes give me process handles
(while referring to them as process IDs in the docs...) and I don't
know how to kill a process with these. Besides, I've found an
amazingly useful PyGTK method, gobject.child_watch_add, which does
exactly what I want on UNIX but wants process handles on Windows. So I
can't use it in conjunction with subprocess there, and if I use some
other way of spawning processes I can't clean them up later.

Is there any way to convert one of these numbers to the other? Or to
get a process handle out of subprocess?
(There must be one down there somewhere, surely?)

Sorry for rambling a bit, am confused.

Regards,
Geoff Bache
 
V

Val-Amart

Hi all,

I've always wondered why os.kill isn't supported on Windows. I found a
discussion somewhere from 2006 about this so it seems others have
wanted it, but still nothing. So I have a half-baked solution
involving calling "taskkill" on Windows Vista or "tskill" on Windows
XP via the shell. I feel there has to be a better way.

I'm also fairly confused about when I've got an ID and when I've got a
handle. The subprocess module gives me IDs which the above programs
accept, but other ways of spawning processes give me process handles
(while referring to them as process IDs in the docs...) and I don't
know how to kill a process with these. Besides, I've found an
amazingly useful PyGTK method, gobject.child_watch_add, which does
exactly what I want on UNIX but wants process handles on Windows. So I
can't use it in conjunction with subprocess there, and if I use some
other way of spawning processes I can't clean them up later.

Is there any way to convert one of these numbers to the other? Or to
get a process handle out of subprocess?
(There must be one down there somewhere, surely?)

Sorry for rambling a bit, am confused.

Regards,
Geoff Bache

My way to do it is using excellent wmi module by Tim Golden, which
relies on Mark Hammond's pywin32 and Windows native wmi functionality.
Here is the link - http://tgolden.sc.sabren.com/python/wmi.html
Maybe, there is a more elegant way of doing that, but it works for me,
and i feel nice with wmi.
 
G

geoffbache

Thanks for the tip. This does seem rather overkill to introduce all
these dependencies just to be able to
kill a process though...

I've discovered that subprocess.Popen objects have a member "_handle"
which is undocumented but
appears to work, so I'm using that for now. Better suggestions
gratefully received...

Geoff
 
T

Tim Golden

Val-Amart said:
My way to do it is using excellent wmi module by Tim Golden, which
relies on Mark Hammond's pywin32 and Windows native wmi functionality.
Here is the link - http://tgolden.sc.sabren.com/python/wmi.html
Maybe, there is a more elegant way of doing that, but it works for me,
and i feel nice with wmi.

While I'm always happy to see WMI promoted <grin> this is one of
these occasions when there *are* other solutions. A few points to respond
to the OP:

1) In the trunk versions of Python (2.6 & 3.0, both in beta), the subprocess.Popen
objects have grown a .kill method:

<dump>

Python 2.6b1+ (trunk:64424, Jun 20 2008, 15:32:22) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
import subprocess
p = subprocess.Popen (["notepad.exe"])
p.kill ()

</dump>


so maybe some of the problem has gone away in any case.

2) The Popen objects have an internal _handle attribute which,
prior to 2.6, is used to pass along to the TerminateProcess
function of the Windows API. Here's a recipe illustrating
various techniques:

http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/347462


3) Under the covers, subprocess calls the CreateProcess Windows API:

http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx

This passes back out four params: the process handle, the thread
handle, the process id and the thread id. The process handle is
kept in the _handle attribute of the Popen object; the process id
is kept in the pid attribute. You can pass whichever of these makes
sense to other routines which require them.

4) (In case it helps). The getpid function of the OS works perfectly
well under windows to return the Process Id of the current process
(*not* the handle).

5) If you *do* use WMI, then be aware that the Win32_Process object
has two likely-looking attributes: Handle and ProcessId. They *both*
contain the process id.

TJG
 
G

geoffbache

Thanks for the help Tim!

Good to see this is being sorted in Python at last, although it'll be
some time
before I can use only Python 2.6 I suspect...

I'm making use of _handle now and it works - most of the time.
The remaining issues are probably PyGTK problems rather than python
ones though,
and hence off topic here.

Regards,
Geoff
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top