Подтвердить что ты не робот

Удалить последнюю строку STDOUT в Python

Я пытаюсь выяснить, как подавить отображение пользовательского ввода на stdout.

raw_input(), за которым следует любой оператор печати, сохраняет то, что пользователь вводил. getpass() не показывает, что пользователь вводил, но он сохраняет приглашение "Пароль:".

Чтобы исправить это, я хотел бы удалить только последнюю строку (которая также удалит новую строку из конца строки).

4b9b3361

Ответ 1

Возможно, вы сможете сделать то, что хотите, с кодами управления VT100.

Что-то вроде этого может быть:

CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)

Ответ 2

Я не совсем уверен, что это работает: возможно, вы могли бы, перед тем, как позвонить raw_input(), замените sys.stdout на ваш самонастраивающийся файл-подобный объект, который проглатывает вывод. Сразу после этого вы можете установить sys.stdout назад к тому, что было до этого.

Изменить: похоже, что этот подход не работает, потому что все, что пользователь набирает, остается на экране.

Другим вариантом управления консолью и прямым управлением клавиатурой является curses.

Ответ 3

Если вы читаете пароль, используйте getpass. Есть много тонких ошибок, связанных с безопасным чтением пароля; это не код, который вы хотите написать себе.

Если вы делаете что-то менее критичное для безопасности, отключить терминальное эхо можно с помощью модуля termios. (Мне хотелось бы, чтобы в коде примера не было неполной, небезопасной реализации getpass, вздоха, но он показывает вам, как отключить терминальное эхо.)

Если вы работаете в Windows, есть эквивалент, но я не знаю, что это такое, и он может не отображаться в стандартной библиотеке Python.

Ответ 4

Следующий код, основанный на документах Python, использует модуль termios и, кажется, делает то, что вы хотите (хотя он не такой компактный, как управляющие коды VT100):

def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = raw_input(prompt)
        print '\r          \r',
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd

p = getpass()

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

Ответ 5

Попробуйте:

CURSOR_UP = '\033[F'
ERASE_LINE = '\033[K'
print(CURSOR_UP + ERASE_LINE)