Ввод с клавиатуры между select() в Python

Я пишу некоторые коды, чтобы получить ввод с клавиатуры, а также проверить, что-то живое или нет:

import sys
from select import select

timeout = 10
while is_alive(): # is_alive is a method to check some stuffs, might take 5 secs
    rlist, _, _ = select([sys.stdin], [], [], timeout)
    if rlist:
        s = sys.stdin.readline()
        print repr(s)
        handle(s) # handle is a method to handle and react according to input s

Я обнаружил, что когда ввод с клавиатуры заканчивается за пределами ожидания в select() (обычно это заканчивается в течение 5 секунд is_alive()), if rlist: станет ложным.

Я могу понять почему, но я не знаю, как это решить.

И есть еще один вопрос, связанный с ситуацией, упомянутой выше, иногда readline() вернет последнюю строку моего ввода, когда некоторые входы расположены в разных select() ожидание.

Это означает, что если я введу "abc \ n" и, к сожалению, "\ n" находится за пределами select() (это означает, что когда я нажимаю Enter, программа выполняет другие части, такие как is_alive()), а затем, если я введу 'def\n', и на этот раз нажата клавиша Enter, расположенная в пределах select()Я посмотрю s от readline() становится 'def\n' и первая строка исчезает.

Есть ли хорошее решение для решения двух вопросов выше? Я использую FreeBSD 9.0.

1 ответ

Решение

Как ваш код в is_alive() звонки ssh, это сожрет стандарт.

Попробуйте начать ssh с -n вариант или с перенаправленным stdin,

Последний будет работать с

sp = subprocess.Popen(..., stdin=subprocess.PIPE)
sp.stdin.close()
Другие вопросы по тегам