如何在Python控制台实现实时密码强度检测功能
如何在Python控制台实现实时密码强度检测功能
当然可以做到!要在控制台实现实时的密码强度检测,核心是要逐字符捕获用户输入,而不是等按下回车才拿到完整密码,同时还要能动态刷新控制台的输出内容。我来给你调整代码,完美实现这个需求:
首先,我们需要处理跨平台的单字符输入(Windows和Linux/macOS的控制台输入机制不一样),然后实时计算密码强度并刷新显示。这里保留了你原来的密码强度评分规则,确保逻辑一致:
import re import sys def evaluate_password(password): score = 1 if len(password) >= 8: score += 1 if any(c.isupper() for c in password): score += 1 if any(c.islower() for c in password): score += 1 if len(re.findall(r'\d', password)) >= 2: score += 1 if re.search(r'[^a-zA-Z0-9]', password): score = 0 return score def get_char(): # 跨平台读取单个按键字符 try: # Windows系统用msvcrt模块 import msvcrt return msvcrt.getch().decode('utf-8') except ImportError: # Linux/macOS用termios和tty修改终端属性 import termios import tty fd = sys.stdin.fileno() old_settings = termios.tcgetattr(fd) try: tty.setraw(sys.stdin.fileno()) ch = sys.stdin.read(1) finally: # 恢复终端原有设置 termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) return ch if __name__ == "__main__": print("输入密码(按回车确认,按退格键删除):") current_pwd = "" while True: char = get_char() # 处理回车键,结束输入流程 if char == '\r' or char == '\n': print() # 换行避免后续内容重叠 break # 处理退格键(Windows是\x08,Linux/macOS是\x7f) elif char == '\x08' or char == '\x7f': if current_pwd: current_pwd = current_pwd[:-1] else: current_pwd += char # 计算当前密码的强度得分 score = evaluate_password(current_pwd) # 构建显示内容,用\r回到行首覆盖之前的输出 # 如果想要隐藏真实密码,把current_pwd改成'*'*len(current_pwd)即可 display_line = f"Password: {current_pwd} | Strength: {'*' * score}" # 用空格填充到终端宽度,避免残留之前的字符 display_line = display_line.ljust(80) sys.stdout.write(f"\r{display_line}") sys.stdout.flush() # 强制刷新输出缓冲区,确保实时显示 print(f"\n最终确认的密码强度:{'*' * evaluate_password(current_pwd)}")
代码说明:
get_char函数:解决了不同操作系统的单字符输入问题,不用等用户按回车就能捕获每个按键。- 实时刷新逻辑:用
\r回到当前行的开头,然后打印新的内容覆盖旧内容,配合flush()强制刷新输出,实现实时更新。 - 兼容操作:处理了回车(结束输入)和退格(删除字符)的常规操作,体验更流畅。
- 可选优化:如果不想显示用户输入的真实密码,只需要把
display_line里的current_pwd替换成'*' * len(current_pwd),这样输入时只会显示星号,同时强度还是实时计算的。
这个代码运行起来后,你输入密码的每一个字符,强度星号都会实时更新,按下回车就会确认保存当前密码,完全符合你的需求!
备注:内容来源于stack exchange,提问作者mxasd
相关产品推荐
相关产品推荐

