2009-06-30 11 views
28

Estoy usando el paquete de subproceso en Python para ejecutar un subproceso, que luego necesito eliminar. Sin embargo, la documentación del paquete del subproceso indica que la función terminate() solo está disponible desde 2.6En Python 2.5, ¿cómo elimino un subproceso?

Estamos ejecutando Linux con 2.5 y por razones de compatibilidad con versiones anteriores no puedo actualizar a 2.6, ¿cuál es la alternativa? Supongo que estas funciones son métodos de conveniencia para algo.

+1

cool: Si pego juntos las respuestas consigo código 'portátil'! – Blauohr

+1

Hay una respuesta portátil ya pegada http://stackoverflow.com/a/8536476/192632 – bogdan

Respuesta

40

Llama a os.kill en el proceso pid.

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

Estás de acuerdo porque estás en Linux. Los usuarios de Windows no tienen suerte.

+3

os.kill (p.pid, signal.SIGTERM) para ser más precisos –

+1

"kill 123" envía SIGTERM. "kill -9 123" envía SIGKILL. Sé amable con el proceso y prueba SIGTERM primero. – Jabba

40

Para completar @ respuesta de Gareth, en Windows lo hace:

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) 
no

tan elegante como os.kill(theprocess.pid, 9), pero funciona ;-)

6

Con el fin de completar @ Gareth de @Alex y respuestas , si no quiere molestarse con el sistema subyacente, puede usar psutil.

psutil es un módulo que proporciona una interfaz para recuperar información en los procesos y sistema de utilización (CPU, memoria) de una manera portátil ejecución mediante Python, implementar muchas funcionalidades ofrecidos por las herramientas de línea de comandos como ps, superior, matar y administrador de tareas de Windows.

Actualmente soporta Linux, OS X, FreeBSD y Windows con Python versiones de 2,4 a 3,1 mediante el uso de una base de código único .

4

eso es una copia & PASE solución completa:

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) 

La aceptación de informes de errores como los comentarios;)

Cuestiones relacionadas