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.

Python: ¿Cómo monitorizar la salida de subprocesos con glib?

Hasta ahora me las he arreglado para utilizar el siguiente método para capturar y procesar la salida de un subprocess:

process = subprocess.Popen(<algún-comando>, shell=True, stderr=subprocess.PIPE)

while True: 
    output = str(process.stderr.readline())
    if process.poll() is not None:
        break
    if output:
        if '<alguna-salida>' in output:
            print('<algo>')
        elif '<alguna-otra-salida>' in output:
            print('algo-más')

Sin embargo, ahora necesito monitorear la salida en segundo plano mientras el programa está haciendo otra cosa.
Este programa está construido alrededor del Glib Mainloop.

Intenté agregar esto al Glib Idle, pero parece que no funciona.

¡Cualquier sugerencia sería muy apreciada!</algún-comando>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como este programa está construido alrededor de Glib Mainloop, se puede considerar el uso de la función GLib g_spawn_async_with_pipes en lugar de subprocess.Popen para generar el subprocess. Esta función te permite monitorizar el output del subprocess de manera asíncrona mientras se ejecuta el bucle principal. Una vez que has generado el subprocess, puedes utilizar GLib’s IO channel API o Unix signal handling para monitorizar la salida.

    Aquí tienes un ejemplo de cómo podrías utilizar g_spawn_async_with_pipes para generar un subprocess y monitorizar su salida de manera asíncrona:

    import gi
    gi.require_version('GLib', '2.0')
    from gi.repository import GLib, Gio
    
    def on_subprocess_stdout(io_channel, condition):
        if condition & GLib.IOCondition.IN:
            # read some data from the io channel
            data = io_channel.readline().strip()
            # do something with the data
            print("Recibido:", data)
        return True
    
    def run_subprocess():
        # generar subprocess con tuberías para stdin/stdout/stderr
        args = ["echo", "Hola Mundo!"]
        flags = Gio.SubprocessFlags.STDOUT_PIPE
        subprocess = Gio.Subprocess.new(args, flags)
        # obtener el canal de salida stdout del subprocess
        stdout_channel = subprocess.get_stdout_pipe()
        # añadir un IO watch en el canal stdout para monitorizarlo
        io_id = GLib.io_add_watch(stdout_channel, GLib.IOCondition.IN, on_subprocess_stdout)
        # esperar a que el subprocess termine
        subprocess.wait_check()
        # remover la monitorización de IO una vez terminado
        GLib.source_remove(io_id)
    
    # ejecutar el subprocess en segundo plano
    loop = GLib.MainLoop()
    GLib.idle_add(run_subprocess)
    loop.run()
    

    En este ejemplo, utilizamos Gio.Subprocess.new para generar el subprocess y capturar su stdout utilizando la flag STDOUT_PIPE. Después utilizamos Gio.Subprocess.wait_check para esperar a que el subprocess termine antes de remover la monitorización de IO utilizando GLib.source_remove. Finalmente, utilizamos GLib.idle_add y GLib.MainLoop.run para ejecutar el subprocess en segundo plano mientras procesamos los eventos de GLib.

    Puedes adaptar este ejemplo para trabajar con tu comando específico de subprocess y monitorizar su salida según las necesidades.

Comments are closed.