`
littlezhuhui
  • 浏览: 6917 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Python 3.x 控制台输入密码的方法总结

阅读更多
最近在用Python 3.2.3,想实现输入密码时回显*号,在网上查找了一下,这方面的资料相当的少,找到方法有几种
1.getpass.getpass()  ,缺点是不回显任何内容,不知道的还以为没有输入进去呢,当然这是unix风格
2. unix系列下使用termios:windows下不好用,模块找不到
3.msvcrt.getch() : 在windows下要用msvcrt代替termios:
import msvcrt, sys
def pwd_input():
    chars = []
    while True:
        newChar = msvcrt.getch()
        if newChar in '\r\n': # 如果是换行,则输入结束
            print ''
            break
        elif newChar == '\b': # 如果是退格,则删除末尾一位
            if chars:
                del chars[-1]
                sys.stdout.write('\b \b') # 删除一个星号
        else:
            chars.append(newChar)
            sys.stdout.write('*') # 显示为星号
    print ''.join(chars)

pwd = pwd_input()
print pwd
以上方法的最大的缺点是sys.stdout.write('\b \b')只有在输入回车时才会生效,也就是看不到星号被删掉的效果,还是不满足要求
并且要注意msvcrt.getch()应在控制台下使用,如果在IDLE等IDE环境下运行,由于IDE模拟的控制台不是标准的控制台,msvcrt.getch()不会得到正确的结果。

下面是我对第三种方法的修正,基本满足了输入密码,可以实时按回退键删掉星号。原理请看源代码的注释:
import msvcrt
def pwd_input():  
    chars = [] 
    while True:
        try:
            newChar = msvcrt.getch().decode(encoding="utf-8")
        except:
            return input("你很可能不是在cmd命令行下运行,密码输入将不能隐藏:")
        if newChar in '\r\n': # 如果是换行,则输入结束             
             break 
        elif newChar == '\b': # 如果是退格,则删除密码末尾一位并且删除一个星号 
             if chars:  
                 del chars[-1] 
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格
                 msvcrt.putch( ' '.encode(encoding='utf-8')) # 输出一个空格覆盖原来的星号
                 msvcrt.putch('\b'.encode(encoding='utf-8')) # 光标回退一格准备接受新的输入                 
        else:
            chars.append(newChar)
            msvcrt.putch('*'.encode(encoding='utf-8')) # 显示为星号
    return (''.join(chars) )

print("请输入密码:") 
pwd = pwd_input()
print("\n密码是:{0}".format(pwd))
input("按回车键退出")
分享到:
评论

相关推荐

    Python实现控制台输入密码的方法

    在Python编程中,控制台输入密码是一个常见的需求,特别是在涉及到用户认证或安全性较高的场景下。在不同的情况下,Python提供了多种实现方法,每种方法都有其优缺点。下面将详细介绍三种常见的控制台输入密码的方法...

    python编程题复习.docx

    2. **随机密码生成**:使用Python的`random`库,特别是`seed()`函数设置随机数种子,以及`randint()`或`choice()`函数生成指定长度的随机字符串,可以包含字母、数字和特殊字符。 3. **随机整数生成**:同样使用`...

    Python模拟银行ATM程序设计.pdf-综合文档

    在Python 2.x版本中,代码块的开始通常使用缩进来表示,而在Python 3.x中,同一代码块的起始使用冒号和缩进共同表示。 文档中提到了一些类的定义,这些类是模拟ATM机操作的基础。例如,“DepositCard”类,它可能...

    试题NCT-Python编程二级-模拟卷5(含答案练习.docx

    7. Python 输出与控制流:在给定的 Python 代码段中,如果 x 为奇数,会输出 "x 是奇数",但实际上 x=3 是奇数,所以输出应该是 "3 是奇数"。 8. Python 打印语句:`print("3+6")` 将输出字符串 "3+6",而不是进行...

    Python如何使用input函数获取输入

    `input()`函数允许程序暂停执行,等待用户在控制台或终端上输入一些文本,然后将这些文本作为字符串返回。这个功能在创建交互式程序时尤其有用,比如简单的命令行应用、游戏或数据输入场景。 ### `input()`函数的...

    亚马逊云aws上运行jupyter notebook(python)

    3. **输入密码**:输入之前设置的密码以完成身份验证。 4. **开始使用**:完成上述步骤后,就可以开始在远程服务器上使用Jupyter Notebook了。 通过这种方式,我们能够在AWS的云环境中运行Jupyter Notebook,既方便...

    利用管道实现sudo命令免输入密码的方法

    本文将详细介绍如何利用管道(pipe)实现`sudo`命令免输入密码的方法。 首先,理解管道(|)的作用。在Linux中,管道是一种机制,它能将一个命令的输出作为另一个命令的输入。例如,在这里,我们用`echo`命令输出...

    Python Cookbook

    11.1 在文本控制台中显示进度条 402 11.2 避免在编写回调函数时使用lambda 404 11.3 在tkSimpleDialog函数中使用默认值和区间 405 11.4 给Tkinter列表框增加拖曳排序能力 406 11.5 在Tkinter部件中输入一个重音...

    Python中变量的输入输出实例代码详解

    例如,password=input("请输入银行卡密码")这条语句将提示用户输入密码,并将用户的输入存储在变量password中。 接下来,我们看一下如何将输入的字符串转换为其他类型。Python中的input()函数总是返回字符串类型的...

    输入及数据类型转换(Python)

    这个函数会暂停程序执行,等待用户在控制台输入数据,然后按回车键。 1.2 输入的特点 - 当程序执行到`input()`时,会停止执行后续代码,直到用户完成输入并按下回车键。 - 用户输入的数据通常会被存储到一个变量中...

    python用户管理系统的实例讲解

    - **Python 3.x**:主要开发语言。 - **装饰器**:提高代码复用性和可维护性。 - **文件读写**:用于持久化存储用户数据。 #### 三、代码解析 本实例代码分为多个部分,下面将逐一进行解析。 ##### 1. 导入模块与...

    py代码-ex12.py - input("string")

    5. **控制台输入输出**:`input()`函数通常与`print()`函数一起使用,形成用户与程序之间的交互。`print()`用于向用户显示信息,而`input()`用于获取用户的反馈。在编写交互式程序时,这两种函数是不可或缺的工具。 ...

    利用Python绘制MySQL数据图实现数据可视化

    在Python环境中,你可以导入`MySQLdb`,然后使用其`connect()`方法连接到MySQL服务器,提供主机名、用户名、密码和数据库名作为参数。 **第三步:执行MySQL查询** 在Python中执行MySQL查询,你需要创建一个游标...

    你应该知道的Python3.6、3.7、3.8新特性小结

    Python3.6引入了`secrets`模块,用于生成安全的随机数,适用于密码、认证令牌和其他敏感数据的生成。 7. **其他新特性**: - `PYTHONMALLOC`环境变量允许配置内存分配器和调试。 - `asyncio`模块更加稳定,其API...

    【ASP.NET编程知识】详解VS2017 Linux 上.NET Core调试.docx

    在 VS 2017 中打开调试-> 附加到进程,选择连接类型为 SSH,然后连接到 Ubuntu 服务器,输入用户名和密码。配置好后,可以附加到进程中,例如,选择类型、附加进程等。 五、其他相关知识点 * PyCharm 远程 Linux ...

    wordpress_selenium_tests2:使用Selenium Java测试Wordpress

    <version>3.x <groupId>org.testng <artifactId>testng <version>7.x ``` 这里使用了TestNG作为测试框架,但你也可以选择JUnit或其他框架。 然后,编写测试类,模拟用户在WordPress中的操作。例如,你...

    c#与PLC的交互代码

    2. **独立于平台**:兼容Windows、Linux、BSD、Oracle Solaris11和Mac OS X等操作系统。 3. **多CPU支持**:适用于Intel和AMD i386/x86_64、ARM、Sun Sparc、Mips等处理器。 4. **无需安装,零配置**:不依赖于任何...

    (英)Raspberry Pi用户指南

    - **从不同操作系统成像**:分别在Linux、OS X和Windows环境下制作Raspberry Pi系统镜像的方法。 #### 七、Raspberry Pi 配置 - **硬件设置**: - **config.txt文件详解**:该文件用于控制Raspberry Pi的硬件行为...

Global site tag (gtag.js) - Google Analytics