En Python 2.5, ¿cómo matar a un subproceso?
-
21-08-2019 - |
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.
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;)