Python中getpass模块无回显输入源码解析


Posted in Python onJanuary 11, 2018

本文主要讨论了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行,内部实现非常简单。但模块内部有很多处理异常情况的代码,很多细节没办法在博客里面展开细说,说了显得??拢?幌袷潜始恰K?越ㄒ橛行巳さ亩琳呋ǖ闶奔湓亩烈幌略绰耄?芏阅?榈南附谟懈?浞值睦斫狻?/p>

以上就是本文关于Python中getpass模块无回显输入源码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
python3.6使用urllib完成下载的实例
Dec 19 Python
Python根据欧拉角求旋转矩阵的实例
Jan 28 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
python装饰器的特性原理详解
Dec 25 Python
Pandas时间序列:重采样及频率转换方式
Dec 26 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
 python中的元类metaclass详情
May 30 Python
python版微信跳一跳游戏辅助
Jan 11 #Python
微信跳一跳python辅助脚本(总结)
Jan 11 #Python
Python用sndhdr模块识别音频格式详解
Jan 11 #Python
Python用imghdr模块识别图片格式实例解析
Jan 11 #Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 #Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 #Python
python实现员工管理系统
Jan 11 #Python
You might like
php循环创建目录示例分享(php创建多级目录)
2014/03/04 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
AngularJS $injector 依赖注入详解
2016/09/14 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
jQuery Chosen通用初始化
2017/03/07 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
Django自定义认证方式用法示例
2017/06/23 Python
python tkinter实现屏保程序
2019/07/30 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python注释、分支结构、循环结构、伪“选择结构”用法实例分析
2020/01/09 Python
keras 自定义loss model.add_loss的使用详解
2020/06/22 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
linux面试相关问题
2013/04/28 面试题
甲乙双方合作协议书
2014/10/13 职场文书
影视后期实训报告
2014/11/05 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
教师求职自荐信范文
2015/03/04 职场文书
上诉答辩状范文
2015/05/22 职场文书
建房合同协议书
2016/03/21 职场文书