]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Bug #1445068: getpass.getpass() can now be given an explicit stream
authorGeorg Brandl <georg@python.org>
Fri, 31 Mar 2006 18:42:16 +0000 (18:42 +0000)
committerGeorg Brandl <georg@python.org>
Fri, 31 Mar 2006 18:42:16 +0000 (18:42 +0000)
argument to specify where to write the prompt.

Doc/lib/libgetpass.tex
Lib/getpass.py
Misc/NEWS

index 28bfe8ff207156aa1b54c99af3c44740470d1372..1d177d3137fe997ced0548a125e7efb55f190a86 100644 (file)
 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}
 
 
index e96491f90bfe2808d14e9f12dc574d7af941ba03..6b786122ecb71ce9146112eaaa52786fdcbf90f5 100644 (file)
@@ -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
index ed48276e9e5a9494afcf4bef188d677f383109f7..4d0e0bd1a09a84df8508115106e61dd145e26468 100644 (file)
--- 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__.