In Python 2.5, how do I kill a subprocess?

Question:

I am using the subprocess package in Python to run a subprocess, which I later need to kill. However, the documentation of the subprocess package states that the terminate() function is only available from 2.6

We are running Linux with 2.5 and for backwards compatibility reasons I cannot upgrade to 2.6, what is the alternative? I am guessing that these functions are convenience methods for something.

Asked By: Uri

||

Answers:

You call os.kill on the process pid.

os.kill(process.pid, signal.SIGKILL)

You’re OK because you’re on on Linux. Windows users are out of luck.

Answered By: Gareth Simpson

To complete @Gareth’s answer, on Windows you do:

import ctypes
PROCESS_TERMINATE = 1
handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, theprocess.pid)
ctypes.windll.kernel32.TerminateProcess(handle, -1)
ctypes.windll.kernel32.CloseHandle(handle)

not quite as elegant as os.kill(theprocess.pid, 9), but it does work;-)

Answered By: Alex Martelli

In order to complete @Gareth’s and @Alex answers, if you don’t want to bother with the underlaying system, you can use psutil.

psutil is a module providing an
interface for retrieving information
on running processes and system
utilization (CPU, memory) in a
portable way by using Python,
implementing many functionalities
offered by command line tools like ps,
top, kill and Windows task manager.

It currently supports Linux, OS X,
FreeBSD and Windows with Python
versions from 2.4 to 3.1 by using a
unique code base.

Answered By: ssoler

Thats a copy&pase complete solution:

def terminate_process(pid):
    # all this shit is because we are stuck with Python 2.5 and 
    # we cannot use Popen.terminate()
    if sys.platform == 'win32':
        import ctypes
        PROCESS_TERMINATE = 1
        handle = ctypes.windll.kernel32.OpenProcess(PROCESS_TERMINATE, False, pid)
        ctypes.windll.kernel32.TerminateProcess(handle, -1)
        ctypes.windll.kernel32.CloseHandle(handle)
    else:
        os.kill(pid, signal.SIGKILL)

Accepting bug reports as comments 😉

Answered By: sorin
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.