import getpass getpass.getpass(prompt='Password: ', stream=None)
prompt='Password:'
- строковое приглашение,stream=None
- файло-подобный объект.Функция getpass()
модуля getpass
печатает подсказку и запрашивает у пользователя пароль без повторения. Входные данные возвращаются в качестве строки для вызывающей стороны.
Пользователю предлагается использовать строковое приглашение prompt
, которое по умолчанию имеет значение 'Password: '
.
В Unix приглашение записывается в файло-подобный объект stream
, используя при необходимости обработчик ошибок замены. Аргумент stream
по умолчанию использует управляющий терминал /dev/tty
или если он недоступен для sys.stderr
.
в Windows аргумент stream
игнорируется .
Если ввод пароля без повтора в системе недоступен, то функция getpass.getpass()
печатает предупреждающее сообщение в поток sys.stdin
и выдает исключение GetPassWarning
.
getpass.getpass()
:>>> import getpass >>> p = getpass.getpass() # Password: >>> p # 'enterpassword' >>> p = getpass.getpass(prompt='Enter password:`) # Enter password:
По умолчанию getpass.getpass()
использует sys.stdout
для печати строки приглашения. Для программы, которая может выдавать полезный вывод на sys.stdout
, часто лучше отправить приглашение в другой поток, такой как sys.stderr
.
Использование sys.stderr
для приглашения означает, что стандартный вывод можно перенаправить в канал или файл, не видя запрос пароля. Введенное пользователем значение по-прежнему не отображается на экране.
>>> import getpass >>> p = getpass.getpass(stream=sys.stderr) # Password: >>> p # 'enterpassword'
getpass
без терминала:В Unix для getpass()
всегда требуется tty
, которым он может управлять через termios
, поэтому эхо-вход может быть отключен. Это означает, что значения не будут считываться из нетерминального потока, перенаправленного на стандартный ввод.
Вызывающая сторона должена определить, когда входной поток не является tty
и в этом случае использовать альтернативный метод для чтения.
# getpass_noterminal.py import getpass, sys if sys.stdin.isatty(): p = getpass.getpass('Using getpass: ') else: print('Using readline') p = sys.stdin.readline().rstrip() print('Read: ', p)
# читаем с терминала $ python3 getpass_noterminal.py Using getpass: Read: sekret # читаем из потока (без терминала) $ echo "sekret" | python3 getpass_noterminal.py Using readline Read: sekret