Python 2.7: читать со стандартного ввода без запроса

Я пытаюсь сделать систему сигнализации Arduino Yun. Он должен делать запросы на мой веб-сервер, чтобы обновить свою статистику. Также необходимо следить за кнопкой и датчиком движения. На стороне Linux работает скрипт на python, который будет делать веб-запросы. Мне нужно, чтобы Arduino отправлял свой статус скрипту Python. В скрипте Python мне нужно читать со стороны Arduino. Я могу сделать это с print raw_input(), но я хочу, чтобы он только читал, если что-то доступно, я не хочу, чтобы это блокировалось, если ничего не доступно. Например:

import time
while 1:
    print "test"
    time.sleep(3)
    print raw_input()
    time.sleep(3)

Если я запускаю его, я хочу напечатать:

test

(6 seconds later)

test

Вместо

test
(Infinite wait until I type something in)

Я пробовал темы, но их немного сложно использовать.

2 ответа

Решение

Я посмотрел на комментарий jakekimds и увидел, что могу просто сделать:

while 1:
    rlist,_,_=select([sys.stdin],[],[],0)
    content=""
    while rlist:
        content+=raw_input()
        rlist,_,_=select([sys.stdin],[],[],0)
    print "blocking task - content:"+content
    time.sleep(5)

Это будет:

  1. Если контент из stdin доступен, сохраните его в content,
  2. Выполните задачу блокировки.
  3. Спи 5 секунд.
  4. Вернитесь к шагу 1.

Простое решение, которое ожидает одну строку данных. Использует файл-подобный объект sys.stdin.

import sys

while True:
    print "Pre"
    sys.stdin.readline()
    print "Post"
Другие вопросы по тегам