如何在Python控制台程序中以"*"方式读取密码?
我正在Windows下用Python写一个控制台程序。
用户需要登录才能使用这个程序,当他们输入密码时,我希望显示为“*”,同时我能获取到用户输入的内容。
我发现标准库里有一个叫getpass的模块,但在输入时它不会显示任何内容(就像Linux那样)。
谢谢。
3 个回答
-1
你可以使用 getpass
模块。这个方法并没有完全回答问题,因为 getpass 函数在控制台上只会显示提示信息,而不会输出其他内容。这样做的原因是为了增加安全性。如果有人在你身后看着,你的密码长度就不会被他们看到。
下面是一个使用它的例子:
from getpass import getpass
getpass('Enter your password: ')
这个例子会显示“请输入你的密码:”,然后你可以在这里输入你的密码。
5
kindall的回答差不多,但有一些问题,比如按退格键时不能删除星号,而且退格键还能回到输入提示符之前。
可以试试:
def win_getpass(prompt='Password: ', stream=None):
"""Prompt for password with echo off, using Windows getch()."""
if sys.stdin is not sys.__stdin__:
return fallback_getpass(prompt, stream)
import msvcrt
for c in prompt:
msvcrt.putwch(c)
pw = ""
while 1:
c = msvcrt.getwch()
if c == '\r' or c == '\n':
break
if c == '\003':
raise KeyboardInterrupt
if c == '\b':
if pw == '':
pass
else:
pw = pw[:-1]
msvcrt.putwch('\b')
msvcrt.putwch(" ")
msvcrt.putwch('\b')
else:
pw = pw + c
msvcrt.putwch("*")
msvcrt.putwch('\r')
msvcrt.putwch('\n')
return pw
注意,mscvrt.putwch在python 2.x中不适用,你需要用mscvrt.putch来代替。
8
getpass
模块是用Python写的。你可以很简单地对它进行修改来实现你的需求。实际上,这里有一个修改过的版本的getpass.win_getpass()
,你可以直接复制粘贴到你的代码里:
import sys
def win_getpass(prompt='Password: ', stream=None):
"""Prompt for password with echo off, using Windows getch()."""
import msvcrt
for c in prompt:
msvcrt.putch(c)
pw = ""
while 1:
c = msvcrt.getch()
if c == '\r' or c == '\n':
break
if c == '\003':
raise KeyboardInterrupt
if c == '\b':
pw = pw[:-1]
msvcrt.putch('\b')
else:
pw = pw + c
msvcrt.putch("*")
msvcrt.putch('\r')
msvcrt.putch('\n')
return pw
不过,你可能要重新考虑一下这个做法。Linux的方式更好;即使只是知道密码的字符数量,对于想要破解密码的人来说,这也是一个很大的线索。