Ответ 1
Возможно, вы сможете сделать то, что хотите, с кодами управления VT100.
Что-то вроде этого может быть:
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
Я пытаюсь выяснить, как подавить отображение пользовательского ввода на stdout.
raw_input()
, за которым следует любой оператор печати, сохраняет то, что пользователь вводил. getpass()
не показывает, что пользователь вводил, но он сохраняет приглашение "Пароль:".
Чтобы исправить это, я хотел бы удалить только последнюю строку (которая также удалит новую строку из конца строки).
Возможно, вы сможете сделать то, что хотите, с кодами управления VT100.
Что-то вроде этого может быть:
CURSOR_UP_ONE = '\x1b[1A'
ERASE_LINE = '\x1b[2K'
print(CURSOR_UP_ONE + ERASE_LINE)
Я не совсем уверен, что это работает: возможно, вы могли бы, перед тем, как позвонить raw_input()
, замените sys.stdout
на ваш самонастраивающийся файл-подобный объект, который проглатывает вывод. Сразу после этого вы можете установить sys.stdout
назад к тому, что было до этого.
Изменить: похоже, что этот подход не работает, потому что все, что пользователь набирает, остается на экране.
Другим вариантом управления консолью и прямым управлением клавиатурой является curses.
Если вы читаете пароль, используйте getpass
. Есть много тонких ошибок, связанных с безопасным чтением пароля; это не код, который вы хотите написать себе.
Если вы делаете что-то менее критичное для безопасности, отключить терминальное эхо можно с помощью модуля termios
. (Мне хотелось бы, чтобы в коде примера не было неполной, небезопасной реализации getpass
, вздоха, но он показывает вам, как отключить терминальное эхо.)
Если вы работаете в Windows, есть эквивалент, но я не знаю, что это такое, и он может не отображаться в стандартной библиотеке Python.
Следующий код, основанный на документах 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)