如何在Python的getpass无法隐藏密码时终止程序?
问题
我需要确保用户不会误输入可见的密码,想实现当Python的getpass无法隐藏密码时,代码直接终止运行。
试过把警告转成异常,但没用,比如这段代码:
warnings.simplefilter('error') password = getpass.getpass("Give me a password, please:")
它不会提前抛异常终止,反而会先让用户输入密码,输入完才报未捕获异常。
解决方案
方法一:捕获getpass的警告并立刻终止程序
getpass在没法隐藏密码时会抛出UserWarning,我们可以替换默认的警告处理器,一旦检测到这个特定警告就直接退出:
import getpass import warnings import sys def check_passwd_warning(message, category, filename, lineno, file=None, line=None): # 识别getpass发出的密码回显警告 if category == UserWarning and "Warning: Password input may be echoed." in str(message): print("错误:当前环境无法隐藏密码输入,程序终止。") sys.exit(1) # 其他警告按默认逻辑处理 warnings._showwarnmsg_impl(message, category, filename, lineno, file, line) # 替换默认警告处理器 warnings.showwarning = check_passwd_warning # 正常获取密码 password = getpass.getpass("请输入密码:")
方法二:提前检查终端是否支持密码隐藏
直接模拟getpass的底层检查逻辑,提前判断终端能不能隐藏输入,不行就直接终止:
import getpass import sys from getpass import _raw_input try: # 获取密码输入的文件描述符 fd = getpass._get_passwd_fd() # 尝试禁用终端回显,测试是否支持 old_term_settings = _raw_input(fd, "") # 测试通过,恢复终端设置 getpass._restore_term_settings(fd, old_term_settings) except Exception: print("错误:当前环境无法隐藏密码输入,程序终止。") sys.exit(1) # 继续获取密码 password = getpass.getpass("请输入密码:")
内容的提问来源于stack exchange,提问作者callegar
相关产品推荐
相关产品推荐

