2009-12-30 7 views
1

J'ai un script qui lors de la première exécution crée un nouveau thread qui enregistre certains événements. Une fois le fil a été créé, je demande une entrée utilisateur à l'aide du code ci-dessous:invite personnalisée en python

user_input = raw_input('>> ') 

Ainsi, lorsque le script tourner l'utilisateur reçoit l'invite « >> », mais quand l'enregistreur du fil créé commence à enregistrer, il commence à ressembler à ceci:

>> Error: Some random error 
Error: Another error 

comme vous pouvez le voir salit-et perdu l'invite. Ce que je veux faire est d'avoir les messages de journal apparaissent mais maintiennent toujours mon curseur sur l'invite prête pour une entrée. comme:

>> 
Error: Some random error 
Error: Another error 
>> 
+1

Vous souhaitez donc écrire deux threads sur la même console sans que la sortie entre en collision? – kurosch

+0

oui, c'est exactement ce que je veux. – Marconi

Répondre

2

Le problème est que votre raw_input() est en cours d'exécution sur un fil complètement différent, et n'a aucune idée que l'enregistreur juste vomie certains messages du journal. Il n'y a donc aucun moyen pour raw_input() de savoir qu'il devrait redessiner l'invite.

Je n'ai pas de solution simple pour vous. Tout ce à quoi je peux penser, c'est que le thread de journalisation n'imprime pas les messages, mais les ajoute à une liste partagée que le thread raw_input() peut voir, et que ce thread imprime les messages après que l'utilisateur entre l'entrée.

En fait, j'ai une autre idée: vous pouvez dessiner l'invite >> en haut de la fenêtre, et avoir les messages de l'enregistreur apparaissent plus bas dans la fenêtre. Si elles sont séparées spatialement, cela n'a pas d'importance si elles sont entrelacées dans le temps.

1

La solution évidente (et probablement la seule correcte) consiste à se connecter à un fichier distinct plutôt qu'à une sortie standard. Si vous souhaitez toujours observer la sortie de journalisation en temps réel, vous pouvez utiliser une commande telle que tail -f dans le fichier de consignation.

+0

Si l'utilisation de la queue -f ne gâchera pas l'invite alors c'est assez bon. Aussi, y a-t-il un équivalent queue -f simple pour python? Ou dois-je lire la dernière ligne manuellement? – Marconi

+0

Ceci est une belle solution simple. Vous exécutez 'tail -f' dans une autre fenêtre de ligne de commande. Vous pouvez même faire en sorte que Python démarre une interface graphique équivalente à 'tail -f' en tant que processus d'arrière-plan. Discussion StackOverflow sur la meilleure interface graphique 'tail -f': http://stackoverflow.com/questions/133821/the-best-tail-gui – steveha