Печать стандартного вывода в приложении командной строки без перезаписи ожидающего пользовательского ввода - PullRequest
1 голос
/ 14 марта 2010

В простом приложении Unix-shell, как вы будете печатать на стандартный вывод, не нарушая ожидающий пользовательский ввод.

например. Ниже приведено простое приложение на 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). Как бы вы обошли это, чтобы оболочка записывала новую строку, сохраняя строку, набранную пользователем в данный момент?

Ответы [ 2 ]

2 голосов
/ 14 марта 2010

Вы должны перенести свой код на некоторый способ управления терминалом как немного лучше, чем телетайп - например, с помощью модуля curses в стандартной библиотеке Python или других способов отодвинуть курсор перед выводом, а затем переместить его туда, где пользователь занят вводом.

0 голосов
/ 14 марта 2010

Вы можете отложить вывод записи до тех пор, пока не получите какой-либо ввод. Для чего-то более продвинутого вам придется использовать ответ Алекса

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
...