Pregunta

Estoy utilizando el paquete de subproceso en Python para ejecutar un subproceso, que luego tengo que matar. Sin embargo, la documentación del paquete de subproceso establece que la función de terminar () sólo está disponible desde el 2,6

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

¿Fue útil?

Solución

Usted llama os.kill en el proceso pid.

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

Estás bien porque estás en Linux. Los usuarios de Windows no están de suerte.

Otros consejos

Para completar la respuesta de @ Gareth, en Windows que hacer:

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 es tan elegante como os.kill(theprocess.pid, 9), pero funciona; -)

Con el fin de completar @ Gareth de @Alex y respuestas, si no quiere preocuparse por el sistema subyacente, puede utilizar psutil .

  

psutil es un módulo que proporciona una   interfaz para la recuperación de información   en los procesos en ejecución y el sistema   utilización (CPU, memoria) en una   manera portátil mediante el uso de Python,   implementar muchas funcionalidades   ofrecido 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.

Eso es una solución completa de copia y pase:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top