La lecture de l'entrée de raw_input() sans avoir l'invite remplacés par d'autres threads en Python
Je suis en train de permettre à l'utilisateur de saisie des commandes à la console à l'aide de raw_input(), cela fonctionne très bien. Le problème est que j'ai threads d'arrière-plan qu'à l'occasion de la sortie de log-les informations à l'écran et quand ils le font ils polluent l'invite d'entrée (depuis la sortie aller là où le curseur se trouve être en ce moment).
C'est un petit programme en Python qui illustrent 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
Ceci est un exemple de ce à quoi 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, c'est pour l'invite à se déplacer le long avec la sortie du fil. Comme:
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>
Aucune idée sur la façon d'atteindre cet objectif sans avoir recours à laide des hacks? 🙂
OriginalL'auteur Jim | 2010-01-17
Vous devez vous connecter pour publier un commentaire.
J'ai récemment rencontré ce problème, et que vous souhaitez quitter cette solution ici pour référence future.
Ces solutions clair dans l'attente de l'raw_input (readline) texte à partir du terminal, imprimer le nouveau texte, puis relancez l'impression à la borne de ce qui était dans le raw_input tampon.
Ce premier programme est assez simple, mais ne fonctionne que quand il y a seulement 1 ligne de texte d'attente pour raw_input:
De sortie:
La seconde gère correctement 2 ou plus en tampon de lignes, mais a plus d' (standard) module de dépendances et exige un petit peu de terminal hackery:
De sortie. Précédent readline lignes effacé correctement:
Sources utiles:
Comment obtenir de la console Linux largeur de la fenêtre en Python
apt comme la colonne de sortie - bibliothèque python
(Cet exemple de code montre comment obtenir terminal de largeur pour Unix ou Windows)
http://en.wikipedia.org/wiki/ANSI_escape_code
blessings
module permet de formater la sortie et se déplacer sans atteindre trop profondément dans le terminal de tripes.Attention, sur certaines versions de Python ce casse si le terminal est redimensionnée en cours d'exécution, en raison d'un bogue dans le
readline
module qui provoque de l'ignorer terminal événements de redimensionnement (afin de ne pas redimensionner la mémoire tampon interne en conséquence et cela brise la colonne de comptage de la logique). Voir bugs.python.org/issue23735. Cela semble être fixé en Python 3.5 heureusement. Kick-ass répondre autrement 🙂OriginalL'auteur jwmullally
Je pense que vous avez besoin de quelque chose qui vous permet d'imprimer de manière dynamique/supprimer/remplacer du texte à partir de la fenêtre de terminal, par exemple, comment les UNIX
watch
outop
commandes de travail.Je pense que dans votre cas, vous avez l'impression de l'Invite ">" mais alors, quand vous obtenez un "Hello World" d'écraser "Invite>" avec "Hello World", puis " imprimer "Invite>" sur la ligne ci-dessous. Je ne pense pas que vous pouvez le faire avec la sortie régulière de l'impression à la borne.
Vous pourriez être en mesure de faire ce que vous voulez à l'aide de Python les malédictions de la bibliothèque. Je ne l'ai jamais utilisé donc je ne peux pas vous dire comment résoudre votre problème (ou si le module sera même en mesure de résoudre votre problème), mais je pense qu'il vaut la peine de prendre un coup d'oeil dans. Une recherche pour "python malédictions tutoriel fourni un PDF document didacticiel qui semble utile.
OriginalL'auteur Roman
vous devez mettre à jour stdout à partir d'un seul fil, pas à partir de plusieurs threads... ou alors vous n'avez aucun contrôle sur entrelacés i/o.
vous souhaitez créer un thread unique pour la sortie de l'écriture.
vous pouvez utiliser une File d'attente dans le fil et tous les autres threads écrire leur sortie de la journalisation des info pour le.. puis le lire à partir de cette File d'attente et d'écrire sur la sortie standard au moment approprié, ainsi que votre message d'invite.
OriginalL'auteur Corey Goldberg
Je ne pense pas que c'est possible. Comment devrait se comporter de toute façon? Rien ne s'affiche jusqu'à ce que l'utilisateur appuie sur Entrée? Si c'est le cas, les résultats n'apparaissent que lorsque l'utilisateur émet une commande (ou quel que soit votre système s'attend), et qui ne semble pas souhaitable.
Il me semble que votre fils doit de sortie vers un autre fichier.
OriginalL'auteur zneak