Как делать другие вещи, пока пользователь решает, писать ли что-нибудь в raw_input? - PullRequest
3 голосов
/ 27 февраля 2012
while True:
  mess = raw_input('Type: ')
  //other stuff

Пока пользователь ничего не печатает, я не могу //other stuff. Как я могу сделать, чтобы другие вещи выполнялись, но, если пользователь что-то наберет в это время, беспорядок изменит свое значение?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вы должны порождать другие ваши вещи в рабочем потоке.

import threading
import time
import sys

mess = 'foo'

def other_stuff():
  while True:
    sys.stdout.write('mess == {}\n'.format(mess))
    time.sleep(1)

t = threading.Thread(target=other_stuff)
t.daemon=True
t.start()

while True:
  mess = raw_input('Type: ')

Это тривиальный пример с mess в качестве глобального.Обратите внимание, что для потоковой безопасной передачи объектов между рабочим потоком и основным потоком вы должны использовать объект Queue для передачи вещей между потоками, не используйте глобальный.

0 голосов
/ 27 февраля 2012

В качестве альтернативы использованию рабочего потока вы можете опросить, доступен ли пользовательский ввод в Unix через select.select():

import select
import sys

def raw_input_timeout(prompt=None, timeout=None):
    if prompt is not None:
        sys.stdout.write(prompt)
        sys.stdout.flush()
    ready = select.select([sys.stdin], [],[], timeout)[0]
    if ready:
        # there is something to read
        return sys.stdin.readline().rstrip('\n')

prompt = "First value: "
while True:
    s = raw_input_timeout(prompt, timeout=0)
    if s is not None:
        mess = s # change value
        print(repr(mess))
        prompt = "Type: " # show another prompt
    else:
        prompt = None # hide prompt
    # do other stuff

Каждый раз, когда пользователь нажимает Введите значение mess изменено.

...