J'essaie de laisser l'utilisateur entrer des commandes sur une console en utilisant raw_input(), cela fonctionne très bien. Le problème est que j'ai des threads d'arrière-plan qui sortent occasionnellement des informations de logs à l'écran et quand ils le font, ils gâchent l'invite de saisie (puisque la sortie va là où le curseur se trouve pour le moment).Lire l'entrée de raw_input() sans avoir l'invite écrasée par d'autres threads en Python
Ceci est un petit programme Python qui illustre ce que je veux dire.
#!/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
Voici un exemple de ce qu'il pourrait ressembler quand je le lance:
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
Ce que je veux est l'invite à se déplacer en même temps que la sortie du fil. Comme si:
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>
Toutes les idées sur la façon d'y parvenir sans avoir recours à des hacks laids? :)
C'est exactement ce que je cherchais. Merci :) – Jim
[module 'bénédictions'] (https://pypi.python.org/pypi/blessings/) permet de formater la sortie et de se déplacer sans trop atteindre les entrailles du terminal. – jfs
Attention, sur certaines versions de Python cela casse si le terminal est redimensionné pendant l'exécution en raison d'un bug dans le module 'readline' qui l'empêche d'ignorer les événements de redimensionnement du terminal (donc il ne redimensionne pas son buffer interne -counting logic). Voir https://bugs.python.org/issue23735. Cela semble être corrigé dans Python 3.5 heureusement. Kick-Ass répond autrement :) – Thomas