Я пытаюсь позволить командам ввода данных пользователем в пульте, используя raw_input (), это хорошо работает. Проблема, у меня есть фоновые нити, которые иногда производят информацию регистрации к экрану и когда они делают они портят быстрый вход (так как продукция идет везде, где курсор, оказывается, в данный момент).
Это - маленькая программа Пайтона, которые иллюстрируют то, что я имею в виду.
#!/usr/bin/env python
import threading
import time
def message_loop():
while True:
time.sleep(1)
print "Hello World"
thread = threading.Thread(target = message_loop)
thread.start()
while True:
input = raw_input("Prompt> ")
print "You typed", input
Это - пример того, на что могло быть похожим, когда я управляю им:
Prompt> Hello World
Hello World
Hello World
Hello World
test
You typed test
Prompt> Hello World
Hello World
Hello World
hellHello World
o
You typed hello
Prompt> Hello World
Hello World
Hello World
Hello World
То, что я хочу, для быстрого, чтобы переместиться наряду с продукцией от нити. Как так:
Hello World
Hello World
Prompt> test
You typed test
Hello World
Hello World
Hello World
Hello World
Hello World
Prompt> hello
You typed hello
Hello World
Hello World
Hello World
Hello World
Prompt>
Какие-либо идеи о том, как достигнуть этого, не обращаясь к ужасным хакерским проникновениям?:)
Я думаю, что вам нужно что-то, что позволяет динамически печатать / удалять / перезаписать текст из оконного окна E.G. Как часы Unix
или TOP
команд работы.
Я думаю, что в вашем случае вы будете печатать «Подсказка>», но затем, когда вы получите «Hello World», вы перезаписываете «Подскажите>» с «Hello World», а затем печать «Подсказка>» на строке ниже. Я не думаю, что вы можете сделать это с регулярной выходной печатью к терминалу.
Вы можете сделать то, что вы хотите использовать библиотеку Python Curses . Я никогда не использовал его, поэтому я не могу сказать вам, как решить вашу проблему (или если модуль даже сможет решить вашу проблему), но я думаю, что стоит взглянуть. Поиск «Учебное пособие в Python Curses» предоставил учебный документ PDF-документа , который кажется полезным.
необходимо обновлять stdout из одного потока, а не из нескольких... иначе вы не можете контролировать interleaved i/o.
вы захотите создать один поток для записи на выходе.
вы можете использовать очередь в потоке и попросить все остальные потоки записать в нее свою выходную лог-файл... затем прочитать из этой очереди и записать в stdout в соответствующее время вместе со своим подсказочным сообщением.
Я не думаю, что это возможно. Как это должно вести себя в любом случае? Ничто не появляется, пока пользователь не нажимает в Enter? Если это так, вывод придет только тогда, когда пользователь выдает команду (или все, что ваша система ожидает), и это не звучит желательно.
Метинкс Ваши потоки должны выводиться в другой файл.