By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,723 Members | 834 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,723 IT Pros & Developers. It's quick & easy.

Terminating processes on Windows (handles and IDs)

P: n/a
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
Jun 27 '08 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On Jun 23, 6:33*pm, geoffbache <geoff.ba...@jeppesen.comwrote:
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.
Jun 27 '08 #2

P: n/a

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
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.
Jun 27 '08 #3

P: n/a
Val-Amart wrote:
On Jun 23, 6:33 pm, geoffbache <geoff.ba...@jeppesen.comwrote:
>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.
While I'm always happy to see WMI promoted <grinthis 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/Coo.../Recipe/347462
3) Under the covers, subprocess calls the CreateProcess Windows API:

http://msdn.microsoft.com/en-us/libr...25(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
Jun 27 '08 #4

P: n/a

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
Jun 27 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.