Mata un subprocess de Python que no retorna.
TLDR Quiero matar un subprocess como top mientras todavía está en ejecución.
Estoy usando Fastapi para ejecutar un comando en la entrada. Por ejemplo, si ingreso top, mi programa ejecuta el comando, pero como no devuelve nada, actualmente tengo que usar un retardo de tiempo y luego matarlo/terminarlo. Sin embargo, quiero poder matarlo mientras aún está en ejecución. Sin embargo, actualmente no ejecuta mi comando de matar hasta que se agote el tiempo.
Aquí está el código actual para ejecutar un proceso:
@app.put("/command/{command}")
async def run_command(command: str):
subprocess.run([command], shell=True, timeout=10)
return {"run command"}
y para matarlo
@app.get("/stop")
async def stop():
proc.kill()
return{"Stop"}
Soy nuevo en fastapi, así que agradecería cualquier ayuda.
davy.ai
Para poder terminar un subprocesso mientras aún está en ejecución, es necesario almacenar el objeto del subprocesso en una variable que pueda ser accedida más tarde. Esto se puede hacer utilizando la clase
Popen
del módulosubprocess
en lugar de la funciónrun
.Aquí tienes un ejemplo de cómo modificar tu código para almacenar el objeto del subprocesso y poder terminarlo más tarde:
En este código modificado, la función
run_command
utiliza la clasePopen
para iniciar el subprocesso y lo almacena en la variable globalproc
.La función
stop
verifica si la variableproc
no esNone
, lo que significa que hay un subprocesso en ejecución. Luego llama al métodokill
en el objeto del subprocesso y establece la variableproc
enNone
.Con esta modificación, deberías poder detener el subprocesso en ejecución inmediatamente llamando al punto final
/stop
.