Кроссплатформенный метод для вставки текста в raw_input (чтобы избежать готовности) в Python

У меня есть приложение (CLI), которое включает функцию редактирования информации об учетной записи. Он делает это, задавая вопрос и помещая старое значение в ответ, чтобы его можно было редактировать. В настоящее время я использую для этого модуль readline. Мне нужен другой способ сделать то же самое, но без этого модуля (я хочу, чтобы приложение работало со всеми функциями в Windows, а также в GNU/Linux в любой операционной системе, на которой работает python) .

Первоначально я нашел следующий код (я немного изменил его, чтобы он соответствовал функции) на следующем веб-сайте, но, поскольку этому потоку уже 4 года, я решил спросить здесь. http://bytes.com/topic/python/answers/471407-default-editable-string-raw_input

import readline
def editInput(question, old_value):
    readline.set_startup_hook(lambda: readline.insert_text(old_value))
    try:
        new_value = raw_input(question)
    finally:
        readline.set_startup_hook(None)
    return new_value

editInput('What\'s the answer? ', '32')

ОБНОВЛЕНИЕ: мне не обязательно нужна альтернатива readline (например, PyReadline). Мне просто нужен такой же результат. Я обновил вопрос, упомянув, что он мне не обязательно нужен для работы в Windows и GNU / Linux, но в любой ОС, поддерживаемой python. Так что в основном используйте только самые простые функции (такие как sys.stdin и т. д.)


person avacariu    schedule 25.07.2010    source источник


Ответы (2)


Функциональность редактирования строк далеко не тривиальна, чтобы ее можно было дублировать. Например, просто функциональность, такая как «прочитать следующее нажатие клавиши без эха» (даже до того, как вы начнете интерпретировать значение этого нажатия клавиши, чтобы переместить курсор и изменить внешний вид на экране, а также запомненное содержимое текстовой строки редактируется) нельзя сделать просто кросс-платформенным способом: вам нужны msvcrt функциональные возможности в Windows и curses функциональные возможности в системах Unix-y, и ваше требование, чтобы оно работало на любой ОС, поддерживаемой Python, вырисовывается огромен, и его невозможно удовлетворить.

Вам нужно очень строго разграничить набор операционных систем / платформ, на которых он должен работать, и подмножество функций редактирования строк, которые он должен обязательно предоставлять, прежде чем можно будет рассмотреть ответ. Если вы просто не можете разграничить эти множества, то ответ прост: то, о чем вы просите, в своей чрезмерной общности просто невозможно.

person Alex Martelli    schedule 25.07.2010
comment
Спасибо за помощь. Думаю, мне нужно посмотреть на другой способ редактирования учетных записей или, может быть, изменить его только для ОС, которые не предоставляют readline. - person avacariu; 25.07.2010

Почему бы не использовать PyReadline? Он используется IPython для более или менее той же функциональности и хорошо поддерживается ими.

На самом деле, поцарапайте это. Я только что попробовал это, и это не работает. Вероятно, pyreadline не поддерживает set_startup_hook.

person Muhammad Alkarouri    schedule 25.07.2010
comment
Мне не обязательно нужны функции readline. Мне нужен тот же результат, который они дают. Я обновлю вопрос. - person avacariu; 25.07.2010
comment
Учитывая обновление вашего вопроса, я могу сказать вам, что не существует решения, которое использует только стандартную библиотеку Python для достижения того, чего вы хотите. Таким образом, о поддержке всех операционных систем, на которых установлен Python, не может быть и речи. - person Muhammad Alkarouri; 25.07.2010
comment
Спасибо за помощь. Думаю, мне нужно посмотреть на другой способ редактирования учетных записей или, может быть, изменить его только для ОС, которые не предоставляют readline. - person avacariu; 25.07.2010