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

 更新时间:2018年01月11日 14:20:56   作者:GanZiQim  
这篇文章主要介绍了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模块无回显输入源码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • 关于Python可视化Dash工具之plotly基本图形示例详解

    关于Python可视化Dash工具之plotly基本图形示例详解

    这篇文章主要介绍了关于Python可视化Dash工具之plotly基本图形示例详解,需要的朋友可以参考下
    2021-03-03
  • PyQt5固定窗口大小的方法

    PyQt5固定窗口大小的方法

    今天小编就为大家分享一篇PyQt5固定窗口大小的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 解决python opencv无法显示图片的问题

    解决python opencv无法显示图片的问题

    今天小编就为大家分享一篇解决python opencv无法显示图片的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python字节码与程序执行过程详解

    Python字节码与程序执行过程详解

    这篇文章主要为大家介绍了Python字节码与程序执行过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Python 中星号(*)的用法小结

    Python 中星号(*)的用法小结

    星号​​*​​ 往往被称为乘法运算符,是所有程序中最为常用的运算符号之一,在Python 中,星号还有很多隐藏的强大功能, 本文将用最容易理解的例子来解释星号*的 五个使用场景,从初级用法到高阶用法,感兴趣的朋友可以参考下
    2023-08-08
  • 关于Python的异常捕获和处理

    关于Python的异常捕获和处理

    程序在运行过程当中,不可避免的会出现一些错误,比如:使用了没有赋值过的变量,使用了不存在的索引,一个数字除以0,这些错误在程序中,我们称其为异常,那么如何处理这些异常呢,今天我们就来看一看
    2023-04-04
  • Python中三种时间格式转换的方法

    Python中三种时间格式转换的方法

    本文主要介绍了Python中三种时间格式转换的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 详解python中的装饰器

    详解python中的装饰器

    装饰器是在不改变函数(当然还有其他的)的代码和调用方式的前提下,为函数增加新的功能,这篇文章给大家详细介绍了python中的装饰器,感兴趣的朋友一起看看吧
    2018-07-07
  • 详解使用python crontab设置linux定时任务

    详解使用python crontab设置linux定时任务

    本篇文章主要介绍了使用python crontab设置linux定时任务,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • python具名元组(namedtuple)的具体使用

    python具名元组(namedtuple)的具体使用

    本文主要介绍了python具名元组(namedtuple)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论