Кроссплатформенный метод для вставки текста в raw_input (чтобы избежать readine) в Python - PullRequest
2 голосов
/ 25 июля 2010

У меня есть приложение (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 и т. Д.)

Ответы [ 2 ]

1 голос
/ 25 июля 2010

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

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

0 голосов
/ 25 июля 2010

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

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

...