如何在Python控制台程序中以"*"方式读取密码?

9 投票
3 回答
10061 浏览
提问于 2025-04-17 04:42

我正在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的方式更好;即使只是知道密码的字符数量,对于想要破解密码的人来说,这也是一个很大的线索。

撰写回答