From 338ef7d2bd3c2ef507d7ef1edce42492dae28db0 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Fri, 31 Mar 2006 18:42:16 +0000 Subject: [PATCH] Bug #1445068: getpass.getpass() can now be given an explicit stream argument to specify where to write the prompt. --- Doc/lib/libgetpass.tex | 8 ++++++-- Lib/getpass.py | 25 +++++++++++++++---------- Misc/NEWS | 3 +++ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Doc/lib/libgetpass.tex b/Doc/lib/libgetpass.tex index 28bfe8ff20..1d177d3137 100644 --- a/Doc/lib/libgetpass.tex +++ b/Doc/lib/libgetpass.tex @@ -11,11 +11,15 @@ The \module{getpass} module provides two functions: -\begin{funcdesc}{getpass}{\optional{prompt}} +\begin{funcdesc}{getpass}{\optional{prompt\optional{, stream}}} Prompt the user for a password without echoing. The user is prompted using the string \var{prompt}, which defaults to - \code{'Password: '}. + \code{'Password: '}. On \UNIX, the prompt is written to the + file-like object \var{stream}, which defaults to + \code{sys.stdout} (this argument is ignored on Windows). + Availability: Macintosh, \UNIX, Windows. + \versionadded[The \var{stream} parameter]{2.5} \end{funcdesc} diff --git a/Lib/getpass.py b/Lib/getpass.py index e96491f90b..6b786122ec 100644 --- a/Lib/getpass.py +++ b/Lib/getpass.py @@ -15,11 +15,14 @@ import sys __all__ = ["getpass","getuser"] -def unix_getpass(prompt='Password: '): +def unix_getpass(prompt='Password: ', stream=None): """Prompt for a password, with echo turned off. + The prompt is written on stream, by default stdout. Restore terminal settings at end. """ + if stream is None: + stream = sys.stdout try: fd = sys.stdin.fileno() @@ -32,18 +35,18 @@ def unix_getpass(prompt='Password: '): new[3] = new[3] & ~termios.ECHO # 3 == 'lflags' try: termios.tcsetattr(fd, termios.TCSADRAIN, new) - passwd = _raw_input(prompt) + passwd = _raw_input(prompt, stream) finally: termios.tcsetattr(fd, termios.TCSADRAIN, old) - sys.stdout.write('\n') + stream.write('\n') return passwd -def win_getpass(prompt='Password: '): +def win_getpass(prompt='Password: ', stream=None): """Prompt for password with echo off, using Windows getch().""" if sys.stdin is not sys.__stdin__: - return default_getpass(prompt) + return default_getpass(prompt, stream) import msvcrt for c in prompt: msvcrt.putch(c) @@ -63,17 +66,19 @@ def win_getpass(prompt='Password: '): return pw -def default_getpass(prompt='Password: '): - print "Warning: Problem with getpass. Passwords may be echoed." - return _raw_input(prompt) +def default_getpass(prompt='Password: ', stream=None): + print >>sys.stderr, "Warning: Problem with getpass. Passwords may be echoed." + return _raw_input(prompt, stream) -def _raw_input(prompt=""): +def _raw_input(prompt="", stream=None): # A raw_input() replacement that doesn't save the string in the # GNU readline history. + if stream is None: + stream = sys.stdout prompt = str(prompt) if prompt: - sys.stdout.write(prompt) + stream.write(prompt) line = sys.stdin.readline() if not line: raise EOFError diff --git a/Misc/NEWS b/Misc/NEWS index ed48276e9e..4d0e0bd1a0 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -487,6 +487,9 @@ Extension Modules Library ------- +- Bug #1445068: getpass.getpass() can now be given an explicit stream + argument to specify where to write the prompt. + - Patch #1462313, bug #1443328: the pickle modules now can handle classes that have __private names in their __slots__. -- 2.40.0