我想写一个小项目,它需要你输入你的id和passwd,但是我需要一个函数用' *'来替换passwd。当你输入passwd时,我只知道raw_input()可以输入一些东西,所以我无法解决问题。怎么写这个函数?
答案 0 :(得分:6)
试试这个:
import getpass
pw = getpass.getpass()
答案 1 :(得分:2)
如果所有其他方法都失败了,你可以修改getpass库(不幸的是你不能对它进行子类化)。
e.g。 Windows代码(source):
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
import random
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':
pw = pw[:-1]
else:
pw = pw + c
stars = random.randint(1,3)
for i in range(stars):
msvcrt.putwch('*') #<= This line added
msvcrt.putwch('\r')
msvcrt.putwch('\n')
return pw
应为输入的每个字符打印'*'
。
修改强>
getpass()
声称与Python 2不兼容,而在Python 2(至少在我的机器上),putwch()
给出了TypeError: must be cannot convert raw buffers, not str
。
这可以通过更改:
来解决 msvcrt.putwch(c)
至msvcrt.putwch(unicode(c))
和
msvcrt.putwch('str')
至msvcrt.putwch(u'str')
如果您不需要处理unicode,只需将putwch()
替换为putch()
。
<强> EDIT2:强>
我添加了一个随机元素,以便每个按键打印1-3颗星
答案 2 :(得分:0)
我在寻找制作python print&#39; *&#39;接受密码而不是空格而我发现 SiHa 的答案确实很有帮助,但它并没有删除&#39; *&#39;如果我们按退格键已打印,所以我再次看到另一篇帖子:How to have password echoed as asterisks,合并后的代码:
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
import random
for c in prompt:
msvcrt.putch(c)
pw = ""
while 1:
c = msvcrt.getwch()
if c == '\r' or c == '\n':
break
elif c == '\003':
raise KeyboardInterrupt
elif c == '\b':
if pw != '': # If password field is empty then doesnt get executed
pw = pw[:-1]
msvcrt.putwch(u'\x08')
msvcrt.putch(' ')
msvcrt.putwch(u'\x08')
else:
pw = pw + c
msvcrt.putch('*') #<= This line added
msvcrt.putch('\r')
msvcrt.putch('\n')
return pw