2013-07-03 2 views
4

Я пытаюсь реализовать интерактивную оболочку поверх внутреннего API, который использует gevent. Я хочу, чтобы фоновые зелени продолжали работать, ожидая ввода пользователя, и мне также нужны функции командной строки readline (история, редактирование строк и т. Д.).Неблокирующий raw_input с редактированием строки с использованием gevent

Моя проблема заключается в том, что raw_input блокируется. Существуют решения, вокруг которых заменить raw_input такими вещами, как:

def raw_input(prompt): 
    sys.stdout.write(prompt) 
    sys.stdout.flush() 

    select.select([sys.stdin], [], []) 
    return sys.stdin.readline().rstrip('\n') 

Это решает проблему блокировки; зеленые фоны теперь работают нормально. Но я теряю интерактивные функции редактирования строк.

Любые предложения или обходные пути?

+0

У меня нет твердого ответа, но несколько подталкиваний, надеюсь, правильное направление: вы пробовали модуль 'cmd' ? Или вы пытались включить модуль 'readline' в свое переопределение« raw_input() »? Я не испытываю оптимизма по поводу последнего случая, так как модуль 'readline' чувствует себя довольно искалеченным по сравнению с фактической библиотекой C, но стоит попробовать. –

+0

Ну, cmd выглядел многообещающим, но по умолчанию он использует raw_input, поэтому он блокирует. Вы можете установить use_rawinput в false, но не только он все еще блокируется, но и вы теряете редактирование строк! – user2547584

ответ

2

Вы можете попробовать использовать raw_input в потоке seprecate и затем вернуть результат в глобальную переменную. Не уверен, что это сработает для вас, это сработало для меня, но в совершенно другом сценарии