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

作者:GanZiQim 时间:2022-05-02 03:58:28 

本文主要讨论了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行,内部实现非常简单。但模块内部有很多处理异常情况的代码,很多细节没办法在博客里面展开细说,说了显得啰嗦,不像是笔记。所以建议有兴趣的读者花点时间阅读一下源码,能对模块的细节有更充分的理解。

来源:http://blog.csdn.net/jy692405180/article/details/61202106

标签:python,getpass,模块
0
投稿

猜你喜欢

  • 如何利用Python写个坦克大战

    2022-05-12 10:53:42
  • python检测lvs real server状态

    2021-12-12 21:21:36
  • 详解 Mysql查询结果顺序按 in() 中ID 的顺序排列

    2024-01-16 06:21:51
  • Django 返回json数据的实现示例

    2021-03-06 21:33:17
  • Python字符串的字符转换、字符串劈分、字符串合并问题分析

    2021-07-22 19:14:24
  • python实操案例练习(八)

    2021-12-17 05:51:45
  • 使用TFRecord存取多个数据案例

    2023-07-14 22:26:34
  • MySQL函数一览_MySQL函数全部汇总

    2024-01-21 17:43:11
  • python发送邮件接收邮件示例分享

    2023-05-25 02:01:47
  • python 动态规划问题解析(背包问题和最长公共子串)

    2021-01-21 14:17:24
  • python变量赋值方法(可变与不可变)

    2021-02-14 08:51:55
  • Python协程 yield与协程greenlet简单用法示例

    2023-02-23 04:07:25
  • Java 数据库连接池c3p0 介绍

    2024-01-22 02:44:24
  • python中为main方法传参问题

    2023-05-20 04:48:12
  • css:小技巧大问题,cellSpacing用css样式代替方法,其它样式类似解决!

    2009-10-04 20:35:00
  • 解决json中ensure_ascii=False的问题

    2023-01-04 10:49:11
  • Vue 2.0+Vue-router构建一个简单的单页应用(附源码)

    2024-05-10 14:17:43
  • JavaScript 中的 setAttribute

    2008-08-18 13:08:00
  • web.py 十分钟创建简易博客实现代码

    2022-10-23 00:55:38
  • MySQL性能优化的最佳20+条经验

    2024-01-27 15:25:06
  • asp之家 网络编程 m.aspxhome.com