Чтение входа от raw_input (), не имея быстрого, переписанного другими нитями в Пайтоне

Я пытаюсь позволить командам ввода данных пользователем в пульте, используя 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> 

Какие-либо идеи о том, как достигнуть этого, не обращаясь к ужасным хакерским проникновениям?:)

11
задан Jim 17 January 2010 в 19:55
поделиться

3 ответа

Я думаю, что вам нужно что-то, что позволяет динамически печатать / удалять / перезаписать текст из оконного окна E.G. Как часы Unix или TOP команд работы.

Я думаю, что в вашем случае вы будете печатать «Подсказка>», но затем, когда вы получите «Hello World», вы перезаписываете «Подскажите>» с «Hello World», а затем печать «Подсказка>» на строке ниже. Я не думаю, что вы можете сделать это с регулярной выходной печатью к терминалу.

Вы можете сделать то, что вы хотите использовать библиотеку Python Curses . Я никогда не использовал его, поэтому я не могу сказать вам, как решить вашу проблему (или если модуль даже сможет решить вашу проблему), но я думаю, что стоит взглянуть. Поиск «Учебное пособие в Python Curses» предоставил учебный документ PDF-документа , который кажется полезным.

3
ответ дан 3 December 2019 в 03:18
поделиться

необходимо обновлять stdout из одного потока, а не из нескольких... иначе вы не можете контролировать interleaved i/o.

вы захотите создать один поток для записи на выходе.

вы можете использовать очередь в потоке и попросить все остальные потоки записать в нее свою выходную лог-файл... затем прочитать из этой очереди и записать в stdout в соответствующее время вместе со своим подсказочным сообщением.

1
ответ дан 3 December 2019 в 03:18
поделиться

Я не думаю, что это возможно. Как это должно вести себя в любом случае? Ничто не появляется, пока пользователь не нажимает в Enter? Если это так, вывод придет только тогда, когда пользователь выдает команду (или все, что ваша система ожидает), и это не звучит желательно.

Метинкс Ваши потоки должны выводиться в другой файл.

0
ответ дан 3 December 2019 в 03:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: