如何隐藏passwd并显示' *'在Python下

时间:2015-07-08 08:21:05

标签: python

我想写一个小项目,它需要你输入你的id和passwd,但是我需要一个函数用' *'来替换passwd。当你输入passwd时,我只知道raw_input()可以输入一些东西,所以我无法解决问题。怎么写这个函数?

3 个答案:

答案 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