es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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ódulo subprocess en lugar de la función run.

    Aquí tienes un ejemplo de cómo modificar tu código para almacenar el objeto del subprocesso y poder terminarlo más tarde:

    import subprocess
    
    from fastapi import FastAPI
    
    app = FastAPI()
    proc = None
    
    @app.put("/command/{command}")
    async def run_command(command: str):
        global proc
        proc = subprocess.Popen(command, shell=True)
        return {"Ejecutar comando"}
    
    @app.get("/stop")
    async def stop():
        global proc
        if proc is not None:
            proc.kill()
            proc = None
        return {"Detener"}
    

    En este código modificado, la función run_command utiliza la clase Popen para iniciar el subprocesso y lo almacena en la variable global proc.

    La función stop verifica si la variable proc no es None, lo que significa que hay un subprocesso en ejecución. Luego llama al método kill en el objeto del subprocesso y establece la variable proc en None.

    Con esta modificación, deberías poder detener el subprocesso en ejecución inmediatamente llamando al punto final /stop.

Comments are closed.