You need to enable JavaScript to run this app. Python如何实现密码输入时隐藏明文、星号回显?适配PyCharm环境
优惠活动
大模型
产品
解决方案
定价
更多

Python如何实现密码输入时隐藏明文、星号回显?适配PyCharm环境

PyCharm环境下带*回显的密码输入实现方案

核心实现逻辑:

  • Python内置getpass模块默认无密码回显,且在PyCharm控制台存在适配缺陷,无法满足“逐字符统一回显*”的要求,需自行捕获键盘输入实现对应逻辑。
  • 需绕过控制台默认的行缓冲机制,逐字符监听输入事件,按规则同步更新回显内容:普通可打印字符输入时同步打印一个*,退格操作时同步删除对应位置的显示内容,回车操作时终止输入流程。

跨平台可运行参考代码

import sys

def input_password(prompt="请输入密码:"):
    print(prompt, end="", flush=True)
    password_buffer = []
    # Windows环境适配
    if sys.platform == "win32":
        import msvcrt
        while True:
            input_char = msvcrt.getch()
            # 捕获回车,结束输入流程
            if input_char in (b"\r", b"\n"):
                print()
                break
            # 捕获退格键,同步回显删除
            elif input_char == b"\x08":
                if password_buffer:
                    password_buffer.pop()
                    sys.stdout.write("\b \b")
                    sys.stdout.flush()
            # 跳过分触发双字节的功能按键(方向键、功能键等)
            elif input_char in (b"\x00", b"\xe0"):
                msvcrt.getch()
                continue
            # 普通字符:存入密码缓冲区,回显*
            else:
                password_buffer.append(input_char.decode())
                sys.stdout.write("*")
                sys.stdout.flush()
    # Mac/Linux环境适配
    else:
        import termios
        import tty
        fd = sys.stdin.fileno()
        old_terminal_setting = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            while True:
                input_char = sys.stdin.read(1)
                # 捕获回车结束输入
                if input_char == "\r":
                    print()
                    break
                # 捕获退格键,同步删除回显内容
                elif input_char == "\x7f":
                    if password_buffer:
                        password_buffer.pop()
                        sys.stdout.write("\b \b")
                        sys.stdout.flush()
                # 普通字符:存入缓冲区,回显*
                else:
                    password_buffer.append(input_char)
                    sys.stdout.write("*")
                    sys.stdout.flush()
        finally:
            # 退出后恢复终端默认设置,避免终端输入逻辑异常
            termios.tcsetattr(fd, termios.TCSADRAIN, old_terminal_setting)
    return "".join(password_buffer)

# 功能测试入口
if __name__ == "__main__":
    input_pwd = input_password()
    print(f"输入完成,密码长度为{len(input_pwd)},明文不会在控制台留存")

运行注意事项

  • 代码直接运行即可在PyCharm控制台实现逐字符回显*的效果,全程不会暴露输入明文。
  • 不要在PyCharm的WSL/远程SSH解释器环境下直接运行这段代码,远程终端的输入转发规则和本地控制台有差异,会导致回显错位。
  • 若运行时出现输入按键无响应,可在PyCharm设置中关闭“控制台将输入行包装为块”选项,再重新运行程序。

内容的提问来源于stack exchange,提问作者PyCharmGivesHope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 07:57:03