如何实现“Python的getpass但仍显示输入”

在我们进行身份验证时,通常会使用getpass模块来隐藏用户输入的密码。但是,有些情况下,我们可能希望在输入密码时仍然能看到输入的内容。这篇文章将带你了解如何用Python实现这种功能,并且在这个过程中,我们会详细讲解每一步的实现。

整体流程

为了实现这个功能,我们将会遵循以下步骤:

步骤 描述
1 导入必要的模块
2 创建获取用户输入的函数
3 处理显示的输入与隐藏输入的逻辑
4 测试获取的用户输入

步骤详细说明

1. 导入必要的模块

在Python中,我们需要先导入必要的模块。 这里我们将使用systtytermios来进行控制台的输入输出。

import sys    # 导入sys模块,用于与Python解释器交互
import tty     # 导入tty模块,处理终端的输入模式
import termios # 导入termios模块,获得终端属性

2. 创建获取用户输入的函数

我们将创建一个名为get_password的函数来获取用户输入的密码。

def get_password(prompt='Password: '):
    print(prompt, end='', flush=True)  # 打印提示语,flush=True确保立即显示
    password = []  # 用于存储输入的密码字符

    # 保存当前终端的设置
    orig_settings = termios.tcgetattr(sys.stdin)

    try:
        tty.setraw(sys.stdin)  # 设置终端为原始模式
        
        while True:
            ch = sys.stdin.read(1)  # 读取一个字符
            if ch == '\n' or ch == '\r':  # 如果是换行符则结束输入
                break
            elif ch == '\x7f':  # 处理退格键
                if password:
                    password.pop()  # 删除最后一个字符
                    sys.stdout.write('\b \b')  # 在控制台回退一个字符,显示空格
                    sys.stdout.flush()  # 清空缓冲区
            else:
                password.append(ch)  # 添加字符到密码列表
                sys.stdout.write(ch)  # 显示输入的字符
                sys.stdout.flush()  # 清空缓冲区
    
    finally:
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)  # 复原终端设置

    return ''.join(password)  # 返回输入的密码
代码注释
  • sys.stdin.read(1): 从输入流中读取一个字符。
  • tty.setraw(sys.stdin): 把终端设置为原始模式,让我们可以按字符读取输入。
  • termios.tcgetattr(sys.stdin): 获取终端的当前设置,以便在最后复原。
  • sys.stdout.write(ch): 将输入的字符写入标准输出,以便用户可以看到输入的内容。

3. 处理显示的输入与隐藏输入的逻辑

get_password函数中,我们增加了对特殊字符的处理,如换行(表示输入结束)和退格(删除最后一个字符)。这让我们的输入体验更接近于实际的密码输入。

4. 测试获取的用户输入

最后,我们将测试这个函数,确保它可以正常工作。

if __name__ == '__main__':
    user_password = get_password()  # 调用获取密码的函数
    print(f'\nYou entered: {user_password}')  # 输出用户输入的密码

类图示意

为了帮助理解,我们可以用类图表示出这个程序的主要组成部分。下面是用 Mermaid 语法生成的类图:

classDiagram
    class GetPassword {
        +get_password(prompt: str) : str
    }

结尾

到这里,我们已经实现了一个Python函数,可以在用户输入密码时显示输入的内容。大致的实现方式包括输入字符的读取、对特殊字符的处理,以及在输入完成后返回密码字符串。这样的功能在开发需要用户输入时,能够提供更友好的用户体验。

你可以根据具体需求,修改这个函数或扩展其功能。希望这篇文章对你有所帮助,能够让你在Python开发的旅途中更加顺利!有任何问题,欢迎留言或询问。