在一个基本的Unix-shell应用程序中,如何打印到stdout而不会打扰任何待处理的用户输入。
e.g。下面是一个回声用户输入的简单Python应用程序。在后台运行的线程每1秒打印一个计数器。
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
注意线程如何在键入时显示用户输入(例如hell1o wo2rld3)。你将如何解决这个问题,以便shell在保留用户当前输入的行的同时写一个新行?
答案 0 :(得分:2)
您必须将代码移植到一些控制终端的方式,这比电传打字机要好一些 - 例如使用Python标准库中的curses模块,或者在发出输出之前将光标移开的其他方法,然后将其移回用户忙于输入内容的位置。
答案 1 :(得分:0)
您可以推迟写入输出,直到您收到一些输入后。对于任何更高级的东西,你必须使用亚历克斯的答案
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