我在Windows下用Python编写一个控制台程序。
用户需要login才能使用该程序,当他input密码时,我希望它们被回显为“*”,而我可以得到用户input的内容。
我在标准库中find了一个名为getpass的模块,但是在input时不会回显任何东西(linux就好)。
谢谢。
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的方式比较好, 即使只知道密码中的字符数量,也是一个想要破解它的人的重要提示。
kindall的答案是接近的,但是它有退格不删除星号的问题,以及backspace能够回到输入提示之外。
尝试:
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代替。
您可以使用getpass
模块。 这并不完全回答这个问题,因为除了提示符外,getpass函数不会向控制台输出任何内容。 原因是这是一个额外的安全层。 如果有人正在看你的肩膀,他们将无法弄清你的密码是多久。
这是一个如何使用它的例子:
from getpass import getpass getpass('Enter your password: ')
此示例将显示“输入您的密码:”,然后您可以输入您的密码。