Проблема с маскировкой ввода пароля в Python
Я использую Python. Я делаю сценарий, где пользователь должен ввести пароль в терминале.
Я уже нашел решение на этом сайте с помощью модуля getpass.
new_password=getpass.getpass(prompt="Type new password: ")
Проблема в том, что я получаю предупреждение, и ввод пароля также отображается.
Warning (from warnings module):
File "C:\Python34\lib\getpass.py", line 101
return fallback_getpass(prompt, stream)
GetPassWarning: Can not control echo on the terminal.
Warning: Password input may be echoed.
2 ответа
Используйте командную строку от имени администратора для запуска этой программы.
Причина в том, что системная среда, в которой stdin, stdout и stderr подключены к /dev/tty или другому PTY-совместимому устройству.
IDLE REPL не соответствует этому требованию.
И изменить new_password=getpass.getpass(prompt="Type new password: ")
в new_password=getpass.getpass("Type new password: ")
если вы используете ОС Windows или new_password=getpass.getpass("Type new password: ",none)
для дистрибутивов Linux.
Это поможет вам наверняка:
import getpass
pw=getpass.getpass("Enter Your Password Here: ")
if (pw=="password"):
print ("You are Welcome...")
else:
print ("Sorry! Your are not allowed.")
Согласно документации Python:
getpass.getpass([prompt[, stream]])
Запрашивать у пользователя пароль без повторения. Пользователю предлагается использовать строковое приглашение, которое по умолчанию имеет значение "Пароль:". В Unix приглашение записывается в поток файловоподобных объектов. поток по умолчанию используется для управляющего терминала (/dev/tty) или если он недоступен для sys.stderr (этот аргумент игнорируется в Windows)
Изменено в версии 2.5: был добавлен параметр потока.
Примечание. Если вы вызываете getpass изнутри IDLE, ввод может осуществляться с терминала, с которого вы запустили IDLE, а не с самого окна ожидания.
Используя обычный терминал с этим кодом:
import getpass
new_password=getpass.getpass(prompt="Type new password: ")
print(new_password)
Будет работать нормально, но если мы попробуем то же самое с IDLE, мы получим ошибку, которую вы выявили в своем вопросе.
Теперь, если мы посмотрим на документы здесь, вы увидите, что это предназначено, это говорит:
Замечание Если вы вызываете getpass изнутри IDLE, ввод может быть сделан в терминале, из которого вы запустили IDLE, а не в самом окне ожидания.