Я пытаюсь реализовать интерактивную оболочку поверх внутреннего 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')
Это решает проблему блокировки; зеленые фоны теперь работают нормально. Но я теряю интерактивные функции редактирования строк.
Любые предложения или обходные пути?
У меня нет твердого ответа, но несколько подталкиваний, надеюсь, правильное направление: вы пробовали модуль 'cmd' ? Или вы пытались включить модуль 'readline' в свое переопределение« raw_input() »? Я не испытываю оптимизма по поводу последнего случая, так как модуль 'readline' чувствует себя довольно искалеченным по сравнению с фактической библиотекой C, но стоит попробовать. –
Ну, cmd выглядел многообещающим, но по умолчанию он использует raw_input, поэтому он блокирует. Вы можете установить use_rawinput в false, но не только он все еще блокируется, но и вы теряете редактирование строк! – user2547584