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

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

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

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

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

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

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

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

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

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

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

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

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

    Следующий код, основанный на документах 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() 

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

    Попробуйте:

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