在命令行应用程序中打印标准输出而不覆盖待定用户输入

时间:2010-03-13 23:01:46

标签: python bash shell scripting stdout

在一个基本的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在保留用户当前输入的行的同时写一个新行?

2 个答案:

答案 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