这里有新鲜出炉的 Python3 Cookbook 中文版, 程序狗速度看过来!
Python 编程语言
Python 是一种面向对象, 解释型计算机程序设计语言, 由 Guido van Rossum 于 1989 年底发明, 第一个公开发行版发行于 1991 年. Python 语法简洁而清晰, 具有丰富和强大的类库. 它常被昵称为胶水语言, 它能够把用其他语言制作的各种模块 (尤其是 C/C++) 很轻松地联结在一起.
这篇文章主要介绍了 Python 中 getpass 模块无回显输入源码解析, 具有一定借鉴价值, 需要的朋友可以参考下
本文主要讨论了 python 中 getpass 模块的相关内容, 具体如下.
getpass 模块
昨天跟学弟吹牛 b 安利 Python 标准库官方文档的时候偶然发现了这个模块. 仔细一看内容挺少的, 只有两个主要 api, 就花了点时间阅读了一下源码, 感觉挺实用的, 在这安利给大家.
getpass.getpass(prompt='Password:', stream=None)
调用该函数可以在命令行窗口里面无回显输入密码. 参数 prompt 代表提示字符串, 默认是'Password:'. 在 Unix 系统中, stream 默认为当前控制的终端. 在 Windows 系统里 stream 参数会被忽略掉, 默认使用 stdin. 如果无法正常使用 getpass, 会打印错误信息, 然后模块会使用有回显的模式读取数据.
>>> import getpass
>>> passwd = getpass.getpass()
Password:
>>> print(passwd)
ganziqim
getpass.getuser()
返回当前用户名. 这个函数会按顺序检查环境变量 LOGNAME, USER, LNAME 和 USERNAME. 返回第一个非空的值. 如果检查不到非空的值, 模块会尝试导入 pwd 模块, 如果系统支持 pwd 模块, 会返回通过 pwd 模块获取的用户名, 否则报错.
>>> getpass.getuser()
'ganzi'
一些细节
1.getpass 模块内部其实实现了 unix_getpass,win_getpass 和 fallback_getpass 三个函数. 在模块被导入之后会首先对用户使用的系统进行检查, 将相应的函数赋值给 getpass. 如果检查失败, 则将 fallback_getpass 赋值给 getpass.
2.win_getpass 使用 msvcrt.getwch() 获取无回显输入.
3.fallback_getpass 不仅在一开始检查系统的时候被调用, 当另外两个函数出现错误的时候也会调用它. 而调用了 fallback_getpass 又会先打印错误信息, 然后再调用模块内部的_raw_input 函数进行有回显的输入读取.
这个是写在模块底部的系统检查代码:
try:
import termios
termios.tcgetattr, termios.tcsetattr
except (ImportError, AttributeError):
try:
import msvcrt
except ImportError:
getpass = fallback_getpass
else:
getpass = win_getpass
else:
getpass = unix_getpass
总结: getpass 模块只有不到 200 行代码(包括注释和模块文档),getuser 的主要代码更是只有短短 7 行, 内部实现非常简单. 但模块内部有很多处理异常情况的代码, 很多细节没办法在博客里面展开细说, 说了显得啰嗦, 不像是笔记. 所以建议有兴趣的读者花点时间阅读一下源码, 能对模块的细节有更充分的理解.
以上就是本文关于 Python 中 getpass 模块无回显输入源码解析的全部内容, 希望对大家有所帮助. 感兴趣的朋友可以继续参阅本站其他相关专题, 如有不足之处, 欢迎留言指出. 感谢朋友们对本站的支持!
来源: http://www.phperz.com/article/18/0131/362738.html