Estoy tratando de dejar que el usuario ingrese comandos en una consola usando raw_input(), esto funciona bien. El problema es que tengo hilos de fondo que ocasionalmente dan salida a la información de registro en la pantalla y cuando lo hacen, estropean la solicitud de entrada (ya que la salida va donde sea que esté el cursor en este momento).Lectura de entrada desde raw_input() sin que el aviso sea sobrescrito por otros hilos en Python
Este es un pequeño programa de Python que ilustra lo que quiero decir.
#!/usr/bin/env python
import threading
import time
def message_loop():
while True:
time.sleep(1)
print "Hello World"
thread = threading.Thread(target = message_loop)
thread.start()
while True:
input = raw_input("Prompt> ")
print "You typed", input
Este es un ejemplo de lo que podría ser similar al ejecutarlo:
Prompt> Hello World
Hello World
Hello World
Hello World
test
You typed test
Prompt> Hello World
Hello World
Hello World
hellHello World
o
You typed hello
Prompt> Hello World
Hello World
Hello World
Hello World
Lo que quiero es que el indicador se mueva junto con la salida del hilo. De la misma manera:
Hello World
Hello World
Prompt> test
You typed test
Hello World
Hello World
Hello World
Hello World
Hello World
Prompt> hello
You typed hello
Hello World
Hello World
Hello World
Hello World
Prompt>
¿Alguna idea sobre cómo lograr esto sin recurrir a feos hacks? :)
Esto es exactamente lo que estaba buscando. Gracias :) – Jim
['bendiciones' módulo] (https://pypi.python.org/pypi/blessings/) permite formatear la salida y moverse sin llegar demasiado profundo en las entrañas de la terminal. – jfs
Tenga cuidado, en algunas versiones Python esto se rompe si el terminal se redimensiona durante el tiempo de ejecución debido a un error en el módulo 'readline' que hace que ignore los eventos de cambio de tamaño del terminal (por lo que no cambia el tamaño de su búfer interno en consecuencia y esto rompe la columna -contabilidad lógica). Ver https://bugs.python.org/issue23735. Esto parece estar corregido en Python 3.5, afortunadamente. Respuesta kick-ass de lo contrario :) – Thomas