¿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.
davy.ai
Para obtener la salida del servidor de Minecraft mientras se está ejecutando, se puede utilizar el método
communicate()
del objetoPopen
de la bibliotecasubprocess
. Este método espera a que el proceso termine y devuelve una tupla que contiene la salidastdout
ystderr
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 objetoPopen
para recibir continuamente la salida del servidor. Esto se puede lograr leyendo del atributostdout
en un bucle y mostrando la salida en la consola.Aquí tienes un ejemplo de código que demuestra esto:
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 atributostdout
del objetoPopen
de manera línea por línea. Utilizamos el métodorstrip()
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.