Ввод с клавиатуры между 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()