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.

¿Cómo leo la salida de un programa externo mientras se está ejecutando en Python?

Estoy intentando hacer un bot que controle un servidor de Minecraft y logré hacer que inicie y envíe comandos al servidor. Sin embargo, no puedo obtener la salida del servidor mientras está en ejecución. Lo que tengo ahora solo me enviará la salida después de que el servidor se haya terminado, como un registro.

process = subprocess.Popen(executable,stdin=PIPE,stdout=PIPE, text=True)
out, err = process.communicate()
print(out)
print(err)

Me gustaría poder utilizar esa información del servidor para crear una consola.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener la salida del servidor de Minecraft mientras se está ejecutando, se puede utilizar el método communicate() del objeto Popen de la biblioteca subprocess. Este método espera a que el proceso termine y devuelve una tupla que contiene la salida stdout y stderr del proceso.

    Sin embargo, dado que se desea obtener la salida mientras el servidor está en ejecución, se puede utilizar el atributo stdout del objeto Popen para recibir continuamente la salida del servidor. Esto se puede lograr leyendo del atributo stdout en un bucle y mostrando la salida en la consola.

    Aquí tienes un ejemplo de código que demuestra esto:

    import subprocess
    
    # Iniciar el proceso del servidor de Minecraft
    process = subprocess.Popen(executable, stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
    
    # Leer continuamente del atributo stdout y mostrar la salida
    while True:
        # Leer una línea de salida del servidor
        output = process.stdout.readline().rstrip()
    
        # Si la salida está vacía, significa que el servidor ha terminado, así que se sale del bucle
        if not output:
            break
    
        # Mostrar la salida en la consola
        print(output)
    

    En este código, iniciamos el proceso del servidor de Minecraft como antes, pero en lugar de utilizar el método communicate(), entramos en un bucle que lee del atributo stdout del objeto Popen de manera línea por línea. Utilizamos el método rstrip() para eliminar cualquier carácter de nueva línea al final de la salida.

    Comprobamos si la salida está vacía, lo cual indica que el servidor ha terminado, y salimos del bucle si es así. De lo contrario, mostramos la salida en la consola.

    Al hacer esto, se puede recibir continuamente la salida del servidor de Minecraft mientras se está ejecutando y utilizar esa información para crear una consola o realizar otras acciones.

Comments are closed.