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
相关产品推荐
相关产品推荐

