2010-03-13 5 views
1

Dans une application Unix-shell de base, comment imprimer sur stdout sans perturber les entrées utilisateur en attente.Impression de l'application Stdout dans une ligne de commande sans écraser l'entrée utilisateur en attente

par exemple. Voici une application Python simple qui fait écho à l'utilisateur. Un fil tournant en arrière-plan imprime un compteur toutes les secondes.

import threading, time 

class MyThread(threading.Thread): 
    running = False 
    def run(self): 
     self.running = True 
     i = 0 
     while self.running: 
      i += 1 
      time.sleep(1) 
      print i 

t = MyThread() 
t.daemon = True 
t.start() 
try: 
    while 1: 
     inp = raw_input('command> ') 
     print inp 
finally: 
    t.running = False 

Notez comment le fil substantype l'entrée d'utilisateur affiché comme on tape le (par exemple hell1o wo2rld3). Comment travailleriez-vous autour de cela, de sorte que le shell écrit une nouvelle ligne tout en préservant la ligne sur laquelle l'utilisateur tape actuellement?

Répondre

2

Vous devez porter votre code à certains façon de contrôler le terminal comme légèrement mieux qu'un télétype - par ex. avec le module curses dans la bibliothèque standard de Python, ou d'autres façons de déplacer le curseur avant d'émettre une sortie, puis de le ramener à l'endroit où l'utilisateur est occupé à saisir des données.

0

Vous pouvez différer l'écriture jusqu'à ce que vous receviez une entrée. Pour quelque chose de plus avancé, vous devrez utiliser la réponse d'Alex

import threading, time 
output=[] 
class MyThread(threading.Thread): 
    running = False 
    def run(self): 
     self.running = True 
     i = 0 
     while self.running: 
      i += 1 
      time.sleep(1) 
      output.append(str(i)) 

t = MyThread() 
t.daemon = True 
t.start() 
try: 
    while 1: 
     inp = raw_input('command> ') 
     while output: 
      print output.pop(0) 
finally: 
    t.running = False 
Questions connexes